Bootstrap

Hibernate对象的生命周期及三种状态

对象生命周期

一个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对象中。

;