1. 程式人生 > >Hibernate物件的生命週期及三種狀態

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物件中。