關於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除了一級緩存區域,還有一個快照區域,當持久態對象第一次被放入一級緩存時,同時會在快照區域放一個這個對象的副本。如果接下來對對象進行了修改操作,一級緩存的數據會同時修改,但快照區域的對象不變。在事務提交時,會對這兩個區域中的對象進行對比,如果相同,說明沒有修改,直接提交。如果不同,會對改變的幾個屬性進行更新操作。