瞭解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 緩存中
一般情況下, 遊離對象是由持久化對象轉變過來的, 因此在數據庫中可能還存在與它對應的記錄