天天看點

112.Hibernate持久化對象的狀态

持久化對象有3種狀态:

持久化狀态

臨時狀态

遊離狀态

Session 的特定方法能使對象從一個狀态轉換到另一個狀态

臨時對象(transient)

    • 在使用代理主鍵的情況下, OID 通常為 null
    • 不處于 Session 的緩存中
    • 在資料庫中沒有對應的記錄
112.Hibernate持久化對象的狀态

持久化對象(也叫”托管”)(Persist)

    • OID 不為 null
    • 位于 Session 緩存中
    • 持久化對象和資料庫中的相關記錄對應
    • Session 在清理緩存時, 會根據持久化對象的屬性變化, 來同步更新資料庫
    • 在同一個 Session 執行個體的緩存中, 資料庫表中的每條記錄隻對應唯一的持久化對象
112.Hibernate持久化對象的狀态

遊離對象(也叫”脫管”)(Detached)

    • OID 不為 null
    • 不再處于 Session 的緩存中
    • 一般情況需下, 遊離對象是由持久化對象轉變過來的, 是以在資料庫中可能還存在與它對應的記錄

Session使用以下方法可以使持久化對象轉變成遊離對象:

112.Hibernate持久化對象的狀态

測試hibernate中對象變化的狀态:

程式代碼 生命周期 狀态

tx = session.beginTransaction();

Customer c = new Customer);

開始生命周期 臨時狀态
Session.save(c) 處于生命周期中 轉變為持久化狀态

Long id=c.getId();

c = null;

Customer c2 = (Customer)session.load(Customer.class,id);

tx.commit();

處于生命周期中 處于持久化狀态
session.close(); 處于生命周期中 轉變為遊離态
c2.getName(); 處于生命周期中 處于遊離态
c2 = null; 結束生命周期 結束生命周期

對象狀态轉化圖

112.Hibernate持久化對象的狀态

對象狀态的總結

112.Hibernate持久化對象的狀态

操縱持久化對象-save()

  1. Session 的 save() 方法使一個臨時對象轉變為持久化對象
  2. Session 的 save() 方法完成以下操作:
  3. 把 News 對象加入到 Session 緩存中, 使它進入持久化狀态
  4. 選用映射檔案指定的辨別符生成器, 為持久化對象配置設定唯一的 OID. 在使用代理主鍵的情況下, setId() 方法為 News 對象設定 OID 使無效的.
  5. 計劃執行一條 insert 語句,把Customer對象目前的屬性值組裝到insert語句中
  6. Hibernate 通過持久化對象的 OID 來維持它和資料庫相關記錄的對應關系. 當 News 對象處于持久化狀态時, 不允許程式随意修改它的 ID

操縱持久化對象-update()

  1. Session 的 update() 方法使一個遊離對象轉變為持久化對象, 并且計劃執行一條 update 語句.
112.Hibernate持久化對象的狀态

操縱持久化對象-saveOrupdate()

saveOrUpdate:

  該方法同時包含save和update方法,如果參數是臨時對象就用save方

   法,如果是遊離對象就用update方法,如果是持久化對象就直接傳回。

如果參數是臨時對象就用save方法

112.Hibernate持久化對象的狀态

如果是遊離對象就用update方法

112.Hibernate持久化對象的狀态

如果是持久化對象就直接傳回,不執行操作

112.Hibernate持久化對象的狀态

繼續閱讀