Hibernate对象的生命周期

在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; 结束生命周期 结束生命周期
  1. 瞬时态(Transient)

    • 当一个新的Java对象实例通过new关键字创建后,并且尚未与任何Hibernate Session关联时,这个对象就被认为是瞬时态(Transient)的。
    • 瞬时对象不被Hibernate管理,它们没有持久化标识符(Identifier),并且不会自动保存到数据库中。
    • 如果没有其他对象引用它们,它们就会被Java垃圾收集器(Garbage Collector)当作普通Java对象一样回收。
  2. 持久态(Persistent)

    • 一旦瞬时对象通过Sessionsave(), persist()或者merge()方法与Session关联起来,它就变成了持久态(Persistent)。
    • 持久态对象与数据库中的记录建立了关联,并且在Session缓存中进行了管理。
    • 对持久态对象的任何修改都会反映到数据库中,前提是这些改变发生在事务提交之前,并且在Session关闭之前。
    • 持久态对象具有一个有效的持久化标识符,并且只要Session不关闭,就能保持与数据库的同步。
  3. 游离态(Detached)

    • 当一个持久态对象与关联的Session断开了联系,例如Session被关闭或者显式地调用了Session.evict()方法,该对象就会变成游离态(Detached)。
    • 游离对象仍然保持着它们的持久化标识符,但是不再受Session的管理,也无法再进行任何数据库操作,除非重新与新的Session关联。
    • 若要重新激活游离对象以便进行进一步的持久化操作,可以使用Session.merge()方法将其再次转变为持久态对象。
  4. 移除态(Removed)

    • 移除态并不是在早期的Hibernate文档中明确列出的三种状态之一,但在后续版本中,被广泛讨论和接受为对象生命周期的一个阶段。
    • 当持久态对象通过Sessiondelete()方法标记为删除时,对象进入移除态(Removed)。
    • 移除态的对象仍然存在于Session缓存中,但在当前事务提交时,Hibernate会将对应的数据库记录物理删除,之后这个对象将不再是持久化对象。

image.png

image.png

posted @   汉源魂  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示