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

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值