Hibernate持久化對象的狀態

瞭解Hibernate持久化對象的狀態可以很好的幫助我們理解hibernate_Session的核心方法,但是如果想要明白持久化對象在Hibernate中是怎麼分類的,我們首先需要搞清楚什麼是OID!

在關係數據庫中,主鍵用來識別記錄,並保證每天記錄的唯一性。在Java語言中,通過比較兩個變量所引用對象的內存地址是否相同,或者比較兩變量引用的對象是否相等。Hibernate爲了解決兩者之間的不同,使用對象標識符(OID)來標識對象的唯一性。OID是關係數據庫中主鍵在Java對象模型中的等價物。在運行時,Hibernate根據OID來維持Java對象和數據庫中的對應關係。如下所示:

Transaction tx = session.beginTransaction();
User user1 = (User)session.load(User.class,new Long(1));
User user2 = (User)session.load(User.class,new Long(1));
User user3 = (User)session.load(User.class,new Long(3));

 

應用程序在執行上述代碼時,第一次OID爲1的對象,從數據庫中查找ID爲1的記錄,然後創建想要的User實例,並把它保存到session的緩存中,最後將該實例的引用賦值給變量user1,第二次加載OID爲1的對象時,直接把session緩存中的OID爲1的實例的引用賦值給user2,因此user1=user2的結果爲true。

 

我們大致可以把Hibernate中的持久化對象的狀態分爲四種:臨時狀態,持久化狀態,刪除狀態,遊離狀態

1、臨時狀態(Transient)

在使用代理主鍵的情況下, OID 通常爲 null
不處於 Session 的緩存中
在數據庫中沒有對應的記錄 

2、持久化狀態(也叫”託管”)(Persist)

OID 不爲 null
位於 Session 緩存中
若在數據庫中已經有和其對應的記錄, 持久化對象和數據庫中的相關記錄對應
Session 在 flush 緩存時, 會根據持久化對象的屬性變化, 來同步更新數據庫
在同一個 Session 實例的緩存中, 數據庫表中的每條記錄只對應唯一的持久化對象

3、刪除狀態(Removed)

在數據庫中沒有和其 OID 對應的記錄
不再處於 Session 緩存中
一般情況下, 應用程序不該再使用被刪除的對象

4、遊離狀態(也叫”脫管”) (Detached)

OID 不爲 null
不再處於 Session 緩存中
一般情況下, 遊離對象是由持久化對象轉變過來的, 因此在數據庫中可能還存在與它對應的記錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章