Hibernate從入門到放棄(三)----持久化物件
物件的三種狀態
對於Hibernate而言,物件狀態分為三種:
瞬時態
當物件剛建立,和Session沒有發生任何關係時,當程式執行完成就立刻消失,被稱為瞬時態。瞬態物件不會被持久化到資料庫中,也不會被賦予持久化標識,如果程式中失去了瞬態物件的引用,瞬態物件將被垃圾回收機制銷燬。使用Hibernate Session可以將其變成持久化狀態。具體的轉化方法如下:
Serializable save(Object obj):將obj物件變為持久化狀態,該物件的屬性將被儲存到資料庫。
void persist(Object obj):將object物件轉化為持久化狀態,該物件的屬性將被儲存到資料庫中。
Serializable save(Object obj,Ojbect pk):將obj物件儲存到資料庫,儲存到資料庫時,指定主鍵值。
void persist(Object obj,Object pk):將obj物件轉化為持久化狀態,該物件儲存到資料庫,指定主鍵值。
持久態
當執行如下程式碼是,物件變為持久態
Emp e = new Emp();
session.save();
持久態的物件和Session發生了關係,如執行了save、get、query等方法
- Session中會快取該物件(Session的快取叫一級快取)
- Session在獲取物件是,首先去查詢一級快取,如果沒有才查詢資料庫。
- Session要負責將持久態物件的變化更新到資料庫。(在是flush()的時候更新,tx在提交的時候會自動呼叫session的flush())。
遊離態
Session關閉之後,持久化物件就變為離線物件。離線表示這個物件不能再與資料庫保持同步,他們不再受Hibernate管理。
遊離物件的特徵。遊離物件具有以下特徵:
1、不再位於Session的快取中,也可以說,遊離物件不被Session關聯。
2、遊離物件是由持久化物件轉變過來的,因此在資料庫中可能還存在與它對應的記錄(前提條件是沒有其他程式刪除了這條記錄)。
遊離物件與臨時物件的相同之處在於,兩者都不被Session關聯,因此Hibernate不會保證它們的屬性變化與資料庫保持同步。遊離物件與臨時物件的區別在於:前者是由持久化物件轉變過來的,因此可能在資料庫中還存在對應的記錄,而後者在資料庫中沒有對應的記錄。
Session的以下方法使持久化物件轉變為遊離物件:
1、當呼叫Session的close()方法時,Session的快取被清空,快取中的所有持久化物件都變為遊離物件。如果在應用程式中沒有引用變數引用這些遊離物件,它們就會結束生命週期。
2、Session的evict()方法能夠從快取中刪除一個持久化物件,使它變為遊離狀態。當Session的快取中儲存了大量的持久化物件,會消耗許多記憶體空間,為了提高效能,可以考慮呼叫evict()方法,從快取中刪除一些持久化物件。但是多數情況下不推薦使用evict()方法,而應該通過查詢語言,或者顯式的導航來控制物件圖的深度。