1. 程式人生 > >Hibernate從入門到放棄(三)----持久化物件

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()方法,而應該通過查詢語言,或者顯式的導航來控制物件圖的深度。