在Hibernate中,持久化对象(Entities)具有三种主要状态,它们分别是:
- 瞬时状态(临时状态):OID(没有值),没有缓存对象。(体现特征:创建对象)
- 持久状态:缓存对象,OID(没有值)(数据库终会有记录,事物没提交)(体现特征:save | saveOrUpdate)
- 游离状态(脱管状态):OID(有值)没有缓存对象,session没有记录,数据库有记录。
代码 | 对象的生命周期状态 | 对象的状态 |
---|---|---|
Users users=new Users(); | 开始生命周期 | 开始生命周期 |
Session session=sessionFactory.openSessin(); | 在生命周期中 | 临时状态 |
Session.save(users); | 在生命周期中 | 转变为持久化状态 |
Tx.commit(); | 在生命周期中 | 持久化状态 |
Session.close(); | 在生命周期中 | 转变为游离状态 |
System.out.println(users.getName()); | 在生命周期中 | 游离状态 |
Users=null; | 结束生命周期 | 结束生命周期 |
-
瞬时态(Transient)
- 当一个新的Java对象实例通过
new
关键字创建后,并且尚未与任何Hibernate Session
关联时,这个对象就被认为是瞬时态(Transient)的。 - 瞬时对象不被Hibernate管理,它们没有持久化标识符(Identifier),并且不会自动保存到数据库中。
- 如果没有其他对象引用它们,它们就会被Java垃圾收集器(Garbage Collector)当作普通Java对象一样回收。
- 当一个新的Java对象实例通过
-
持久态(Persistent)
- 一旦瞬时对象通过
Session
的save()
,persist()
或者merge()
方法与Session
关联起来,它就变成了持久态(Persistent)。 - 持久态对象与数据库中的记录建立了关联,并且在Session缓存中进行了管理。
- 对持久态对象的任何修改都会反映到数据库中,前提是这些改变发生在事务提交之前,并且在Session关闭之前。
- 持久态对象具有一个有效的持久化标识符,并且只要Session不关闭,就能保持与数据库的同步。
- 一旦瞬时对象通过
-
游离态(Detached)
- 当一个持久态对象与关联的
Session
断开了联系,例如Session被关闭或者显式地调用了Session.evict()
方法,该对象就会变成游离态(Detached)。 - 游离对象仍然保持着它们的持久化标识符,但是不再受Session的管理,也无法再进行任何数据库操作,除非重新与新的Session关联。
- 若要重新激活游离对象以便进行进一步的持久化操作,可以使用
Session.merge()
方法将其再次转变为持久态对象。
- 当一个持久态对象与关联的
-
移除态(Removed)
- 移除态并不是在早期的Hibernate文档中明确列出的三种状态之一,但在后续版本中,被广泛讨论和接受为对象生命周期的一个阶段。
- 当持久态对象通过
Session
的delete()
方法标记为删除时,对象进入移除态(Removed)。 - 移除态的对象仍然存在于Session缓存中,但在当前事务提交时,Hibernate会将对应的数据库记录物理删除,之后这个对象将不再是持久化对象。