我們都知道hibernate中的數據對象有3種狀態,那麼這三種狀態到底是哪種狀態,他們之間是如何轉換的,這些狀態都有什麼用,帶著這一系列的問題,我們一起對hibernate的3種狀態了解一下。
hibernate的3種狀態圖如下所示:
瞬時狀態(Transient):由Java通過new方法創建的對象或者托管、持久狀態調運session的delete()方法得到的對象。值只存在與內存中,和數據庫中沒有任何關聯。我麼可以通過調運session的save()/seavOrUpdate()方法,將這個內存中的零時對象持久化到數據庫中,這樣,這個對象就和session有了關聯,和數據庫也有了關聯,就是一個持久狀態的對象。如果長時間只存在於內存中不被別的對象引用,那麼就會被Java的垃圾回收機制回收,釋放內存。
持久狀態(Pesistent):由瞬時狀態保存(調運session的save()方法)以後或者直接通過Java的方法從session中查詢(調運session的get()等方法)得到或者托管狀態調運session的update()方法得到的結果對象。對象信息不僅存在於內存中,而且存在於數據庫中,並且內存中的和數據庫中的信息是完全相同的。我麼可以通過調運事物的方法,將持久狀態和數據庫中的信息脫離干系,這個時候它就變成托管狀態,或者我們調運session的delete()方法,將它從數據庫中刪除,那麼它又變成瞬時狀態。
托管狀態(Detached):由持久狀態調運事物的方法(事物結束以後,和session沒有關系)以後得到的對象。對象信息存在與內存中,數據庫中也有,但是數據庫中的信息和對象的信息出來有相同的Id以為,不再有其他的關系,他們可以不同。調運session的update()方法以後,再次將內存中的對象同步到數據中,又變成持久狀態。或調運delete()方法,完全和數據庫脫離干系變成瞬時狀態。如果長時間處於內存中不被別的對象引用,同樣會被Java的內存回收機制回收,釋放內存。
狀態\說明
性質
來源
去處
瞬時狀態
Transient
只存在於內存中,數據庫中沒有它的記錄
1、由程序直接new()的
2、持久狀態刪除對象
3、托管狀態刪除對象
1、保存變為持久狀態
2、被JVM回收持久狀態
Pesistent
存在於內存和數據庫中,而且他們的值完全相同
1、由程序直接讀取數據庫
2、瞬時狀態保存
3、托管狀態更新
1、刪除對象變成瞬時狀態
2、清理session變成托管狀態
托管狀態
Detached
存在於內存和數據庫中,但是內存中的和數據庫中的值除了主鍵相同外,其他信息可能不同
1、持久狀態清理session
1、更新對象變成持久狀態
2、刪除對象變成持久狀態
3、被JVM回收
?
注意:
1、當對象被保存以後,變成持久狀態。如果再對對象進行修改,對象數據就變成內存髒數據,此時再提交事物,HIbernate會將內存數據同步到數據庫中,會調運update方法,即使沒有顯示的調運session.update()方法。
2、當托管狀態下的對象,再次被session管理以後,直接調運update方法就會將數據庫中數據和對象數據同步,對象再次被session管理。