天天看點

Hibernate 對象的三種狀态 transient persistent detached

Hibernate對象狀态 

臨時(Transient) - 由new操作符建立,且尚未與Hibernate Session 關聯的對象被認定為臨時(Transient)的。臨時(Transient)對象不會被持久化到資料庫中,也不會被賦予持久化辨別(identifier)。 如果臨時(Transient)對象在程式中沒有被引用,它會被垃圾回收器(garbage collector)銷毀。 使用Hibernate Session可以将其變為持久(Persistent)狀态。(Hibernate會自動執行必要的SQL語句) 

持久(Persistent) - 持久(Persistent)的執行個體在資料庫中有對應的記錄,并擁有一個持久化辨別(identifier)。 持久(Persistent)的執行個體可能是剛被儲存的,或剛被加載的,無論哪一種,按定義,它存在于相關聯的Session作用範圍内。 Hibernate會檢測到處于持久(Persistent)狀态的對象的任何改動,在目前操作單元(unit of work)執行完畢時将對象資料(state)與資料庫同步(synchronize)。 開發者不需要手動執行UPDATE。将對象從持久(Persistent)狀态變成瞬時(Transient)狀态同樣也不需要手動執行DELETE語句。 

遊離(Detached) - 與持久(Persistent)對象關聯的Session被關閉後,對象就變為遊離(Detached)的。 對遊離(Detached)對象的引用依然有效,對象可繼續被修改。遊離(Detached)對象如果重新關聯到某個新的Session上, 會再次轉變為持久(Persistent)的(在Detached其間的改動将被持久化到資料庫)。 這個功能使得一種程式設計模型,即中間會給使用者思考時間(user think-time)的長時間運作的操作單元(unit of work)的程式設計模型成為可能。 我們稱之為應用程式事務,即從使用者觀點看是一個操作單元(unit of work)。

Hibernate中對象的遊離狀态是指Session關閉之後,持久化對象變成離線對象,離線對象就不能同資料庫同步,也不再受Hibernate管理。操作 處于遊離态對象 經常會報 session已關閉的錯誤。