对象生命周期
一个Java对象从被创建开始,到不再使用,被垃圾回收期回收为止。
三种状态
对象(持久化类实例)要处于session对象的管理中才能与数据库发生联系。
在基于hibernate框架的应用中,我们依据对象与Session对象的关系不同情况,把对象的状态人为地分为三种:
1)瞬时状态 (Transient):如果对象从未与Session对象关联过,称该对象处于瞬时状态。
2)持久状态(Persistent) :如果对象与Session对象关联起来,且该对象对应到数据库记录,则称该对象处于持久化状态。
3)脱管状态(Detached):如果对象曾经与Session关联过,但因为Session被关闭或调用了Session的evict或clear方法把它从Session中移除了,则该对象脱离了Session的管理,这种状态为脱管状态。
三种状态之间的转换
1)瞬时对象(Transient)
1.1)new 创建 (无->Transient)
1.2)delete--(Persistent->Transient) session.delete(o)
2)持久对象(Persistent)
1.1)save/saveOrUpdate.(Transient->Persistent)
1.2)get/load/find,iterator.(无->Persistent)
get--get(User.class,id),通过类名和id从数据库读取指定记录,无匹配记录返回null。
load--通过类名和id从数据库读取指定记录,无匹配记录抛OjectNotException异常。
find,iterator---hibernate3已废除,统一Query接口提供。
1.3)update/saveOrUpdate/lock.(Detached->Persistent)
lock--把对象和session关联起来,lock之前的修改不会更新到数据库。
update--把对象和session关联起来,并且会把修改更新到数据库。
saveOrUpdate--把对象和session关联起来,并且会把修改更新到数据库。
3)脱管对象(Detached)
evict--把某个对象从session中移除(Persistent->Detached)
clear--把所有对象从session中移除
close--关闭session,其中的对象也全部被移除了。
状态转换的图示,如下:
三种状态的比较
status | Mem | Session | DB |
Transient | Y | N | N |
Persistent | Y | Y | Y |
Detached | Y | N | Y |
瞬时状态的对象只存在于内存中。
持久状态的对象分别存在于内存、session对象、数据库之中。
脱管状态的对象存在于内存、数据库之中,但不在session对象中。