首页常见问题正文

Java培训:持久化对象的状态及状态转换

更新时间:2023-11-16 来源:黑马程序员 浏览量:

IT培训班

  Hibernate是持久层的ORM框架,专注于数据的持久化工作。在进行数据持久化操作时,持久化对象可能处于不同的状态中。这些状态可分为三种,分别为瞬时态、持久态和脱管态。下面分别针对这三种状态进行简单介绍。

  1.瞬时态(transient)

  瞬时态也称为临时态或者自由态,瞬时态的对象是由new关键字开辟内存空间的对象,不存在持久化标识OID(相当于主键值),且未与任何的Session实例相关联,在数据库中也没有记录,失去引用后将被JVM回收。瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系。

  2.持久态(persistent)

  持久态的对象存在一个持久化标识OID,当对象加入到Session缓存中时,就与Session实例相关联。它在数据库中存在与之对应的记录,每条记录只对应唯一的持久化对象。需要注意的是,持久化对象是在事务还未提交前变成持久态的。

  3.脱管态(detached)

  脱管态也称离线态或者游离态,当持久化对象与Session断开时就变成了脱管态,但是脱管态依然存在持久化标识OID,只是失去了与当前Session的关联。需要注意的是,脱管态对象发生改变时Hibernate是不能检测到的。

  在Hibernate运行时,持久化对象的三种状态是可以通过一系列的方法进行转换的。这三种状态之间的转换关系具体如图24-1所示。

1700099780767_持久化对象的状态转换.jpg

  图24-1 持久化对象的状态转换

  从图24-1中可以看出,当一个对象通过new关键字创建后,该对象处于瞬时态;当对瞬时态对象执行Session的save()或saveOrUpdate()方法后,该对象将被放入Session的一级缓存之中,此时该对象处于持久态;当对持久态对象执行evict()、close()或clear()操作后,对象会进入脱管态;当直接执行Session的get()、load()、find()或iterate()等方法从数据库中查询出对象时,查询到的对象也会处于持久态;当对数据库中的记录进行update()、saveOrUpdate()以及lock()等操作后,此时脱管态的对象就会过渡到持久态;由于瞬时态和脱管态的对象不在session的管理范围内,所以会在一段时间后被JVM回收。

  本文版权归黑马程序员Java培训学院所有,欢迎转载,转载请注明作者出处。谢谢!

  作者:黑马程序员Java培训学院

  首发:https://java.itheima.com

分享到:
在线咨询 我要报名
和我们在线交谈!