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