Hibernate中,持久化类的实例对象的种类以及对应的状态---可以分为3类:
瞬时对象(Transient Objects):处于临时状态的对象属于瞬时对象---对应 瞬态(Transient)。
java对象何时会进入临时状态?
(1) 当通过new语句刚创建了一个Java对象,它处于临时状态,此时不和数据库中的任何记录对应。
(2) Session的delete()方法能使一个持久化对象或游离对象转变为临时对象。对于游离对象,delete()方法从数据库中删除与它对应的记录;对于持久化对象,delete()方法从数据库中删除与它对应的记录,并且把它从Session的缓存中删除。
持久化对象(Persist Objects):持久实例是任何具有数据库标识的实例----持久态(Persistent)。当事务提交时,通过执行SQL的INSERT,UPDATE和DELETE语句把内存中的状态同步到数据库中。
java对象何时会进入持久化状态?
(1) Session的save()方法把临时对象转变为持久化对象。
(2) Session的load()或get()方法返回的对象总是处于持久化状态。
(3) Session的find()方法返回的List集合中存放的都是持久化对象。
(4) Session的update()、saveOrUpdate()和lock()方法使游离对象转变为持久化对象。
(5)当一个持久化对象关联一个临时对象,在允许级联保存的情况下,Session在清理缓存时会把这个临时对象也转变为持久化对象。
离线对象(Detached Objects),也叫脱管(detached)状态:Session关闭之后,持久化对象就变为离线对象。
java对象何时会进入游离状态?
(1) 当调用Session的close()方法时,Session的缓存被清空。如果在应用程序中没有引用变量引用这些游离对象,它们就会被回收,结束生命周期。
(2)Session的evict()方法时。evict()方法能够从缓存中删除一个持久化对象,使它变为游离状态,降低内存消耗。
(但是多数情况下不推荐使用evict()方法,而应该通过查询语言,或者显式的导航来控制对象图的深度。)
请注意,离线对象不是瞬时对象,区别:
1、相同点:离线对象和瞬时对象都与session没有关联。
2、不同点:离线对象和数据库记录存在关联,可以通过lock()/updateOrSave等方法变为持久化状态。但是后者与任何数据都无关。
持久化对象的生命周期可以通过它们之间的状态转化关系理解: