Hibernate持久化对象的状态

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 可能有(数据没有删除)也可能没有