Hibernate持久化對象的三種狀態深入理解


 

關於OID

  hibernate緩存是一個map,他會根據OID作為緩存對象的key,我們的映射文件中<id>標簽指定的屬性值會作為OID

 

持久化對象的三種狀態

 

為了方便理解,Hibernate為持久化對象定義了三個狀態:

瞬時態:沒有持久化標識OID,沒有被納入Session對象的管理

持久態:有持久化標識OID,已經被納入Session對象的管理

托管態:有持久化標識OID,但沒有被Session對象管理

用一個小示例來演示:Hibernate

持久態的一個常見誤解

需要注意的是,被納入session對象的管理的持久態對象,僅僅是放入了session的一級緩存,卻不一定會同步到數據庫。(session中有一個PersistenceContext對象,本質就是一個map集合,一級緩存的數據就存在這里),如下圖所示。

user被賦予了id

由上圖可知,當執行到save()操作時,user已經被放到session中管理,並且已經擁有了id值,此時user是持久態的,但是現在數據庫里並沒有user的數據,因為還沒有提交事務,所以持久態的對象並不一定就存在於數據庫中。

 

關於持久態對象自動更新的能力

  當在一個session中,對一個持久態的對象進行修改后,即使不執行update()方法,在事務提交時,也會會自動將修改后的數據同步到數據庫。實現原理如下圖:

 

 這種機制實現的原理就是,session除了一級緩存區域,還有一個快照區域,當持久態對象第一次被放入一級緩存時,同時會在快照區域放一個這個對象的副本。如果接下來對對象進行了修改操作,一級緩存的數據會同時修改,但快照區域的對象不變。在事務提交時,會對這兩個區域中的對象進行對比,如果相同,說明沒有修改,直接提交。如果不同,會對改變的幾個屬性進行更新操作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM