生命周期
Hibernate有三种状态,可以互相发生转换。
1.三种状态:
瞬时对象(transientObjects)就是刚刚new出来的对象,数据库中没有记录,也没有被Hibernate的Session管理起来,这种对象是会被GC回收的。[数据库里没有,session里没有]
持久对象(persistentObjects)经历了持久化操作的对象,数据库有记录,被Hibernate的Session管理起来。[数据库里有,session里也有]
托管对象(detachObject),数据库有记录,但没被Hibernate的Session管理起来。[数据库里有,但是session里没有]
2. 对象转换图
hibernate的生命周期有三种状态,临时、持久和托管。所谓临时状态就是刚刚new出来的对象的状态,临时对象并未存在于数据库也没有被session管理,此时这个对象是有可能被GC回收的,如果临时对象经历了持久化操作,如save()或saveOrUpdate()等,那么它将进入持久状态,持久对象会出现在数据库中,且被session管理起来,当然如果一开始就是查询业务,如get()、load()和iterator()等操作,那么对象将直接进入持久状态。持久对象通过delete()方法可以退回到临时状态,也可以通过close()、clear()或evict()等操作进入托管状态,托管对象在数据库中仍是存在的,但不会再被session管理了,除非再次进行持久化操作,如update()或saveOrUpdate()方法等,那么它将退回到持久状态,或者调用delete()方法退回到临时状态,否则,托管对象最终也会被GC回收。
3. 瞬时-持久
tips:如果调用session.delete(userPojo),则userPojo回退为瞬时对象。
4.持久-托管
如果session关闭,或者调用clear方法,或者调用evict方法,那么对象就从持久状态,变成了托管状态,该对象在数据库中仍然存在,但是不再由session管理。
如果继续去调用session.update(userPojo),则再次利用session接管这个对象,对象从托管状态重新变成持久状态,当然前提是session没有关闭。
如果调用session.delete(userPojo),则userPojo回退为瞬时对象。