Hibernate持久化对象存在三种状态:
transient(瞬时态), 尚未与Hibernate Session关联对象,被认为处于瞬时状态,失去引用将被JVM回收,无持久化标识OID,未与Session关联
persistent(持久态) 数据库中有数据与之对应并与当前session有关联,并且相关联的session没有关闭数据库并且事务未提交 ,存在持久化标识OID,与Session关联
detached(脱管态) 数据库中有数据与之对应,但当前没有session与之关联,脱管状态改变hibernate不能检测到,存在持久化标识OID,未与Session关联
持久化对象状态转换
瞬时转换:
瞬时 –> 持久 :执行save() , saveOrUpdate()
瞬时 –> 脱管 :手动设置OID,(删除)
持久转换:
持久 –> 瞬时 :执行delete()
持久 –> 脱管 :与session取消关系,evict(obj),close(),clear()
脱管转换:
脱管 –> 瞬时 :手动移除OID
脱管 –> 持久 :执行update,saveOrUpdate()
测试hibernate中java对象的状态
代码 | 生命周期 | 状态 |
---|---|---|
tx = session.beginTransaction(); Customer c = new Customer(); | 开始生命周期 | 瞬时状态 |
Session.save(c) | 处于生命周期中 | 转变为持久化状态 |
Long id=c.getId();c=null;Customer c2=(Customersession.load(Customer.class,id);tx.commit(); | 处于生命周期中 | 处于持久化状态 |
session.close(); | 处于生命周期中 | 转变为脱管态 |
c2.getName(); | 处于生命周期中 | 转变为脱管态 |
c2 = null; | 结束生命周期 | 结束生命周期 |
对象的状态总结:
状态 | Session存在对应的记录 | 数据中存在对应的记录 |
---|---|---|
临时态 | no | no |
持久态 | yes | 可能有,也可能没有(持久对象,但数据库中没有) |
游离态 | no | 可能有(数据没有删除)也可能没有 |
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/12084.html