更新时间:2023-11-16 来源:黑马程序员 浏览量:
Hibernate是持久层的ORM框架,专注于数据的持久化工作。在进行数据持久化操作时,持久化对象可能处于不同的状态中。这些状态可分为三种,分别为瞬时态、持久态和脱管态。下面分别针对这三种状态进行简单介绍。
瞬时态也称为临时态或者自由态,瞬时态的对象是由new关键字开辟内存空间的对象,不存在持久化标识OID(相当于主键值),且未与任何的Session实例相关联,在数据库中也没有记录,失去引用后将被JVM回收。瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系。
持久态的对象存在一个持久化标识OID,当对象加入到Session缓存中时,就与Session实例相关联。它在数据库中存在与之对应的记录,每条记录只对应唯一的持久化对象。需要注意的是,持久化对象是在事务还未提交前变成持久态的。
脱管态也称离线态或者游离态,当持久化对象与Session断开时就变成了脱管态,但是脱管态依然存在持久化标识OID,只是失去了与当前Session的关联。需要注意的是,脱管态对象发生改变时Hibernate是不能检测到的。
在Hibernate运行时,持久化对象的三种状态是可以通过一系列的方法进行转换的。这三种状态之间的转换关系具体如图24-1所示。
图24-1 持久化对象的状态转换
从图24-1中可以看出,当一个对象通过new关键字创建后,该对象处于瞬时态;当对瞬时态对象执行Session的save()或saveOrUpdate()方法后,该对象将被放入Session的一级缓存之中,此时该对象处于持久态;当对持久态对象执行evict()、close()或clear()操作后,对象会进入脱管态;当直接执行Session的get()、load()、find()或iterate()等方法从数据库中查询出对象时,查询到的对象也会处于持久态;当对数据库中的记录进行update()、saveOrUpdate()以及lock()等操作后,此时脱管态的对象就会过渡到持久态;由于瞬时态和脱管态的对象不在session的管理范围内,所以会在一段时间后被JVM回收。
本文版权归黑马程序员Java培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:黑马程序员Java培训学院