持久化對象有3種狀态:
持久化狀态
臨時狀态
遊離狀态
Session 的特定方法能使對象從一個狀态轉換到另一個狀态
臨時對象(transient)
-
- 在使用代理主鍵的情況下, OID 通常為 null
- 不處于 Session 的緩存中
- 在資料庫中沒有對應的記錄
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLxcTOxUDO0ITM3AjMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
持久化對象(也叫”托管”)(Persist)
-
- OID 不為 null
- 位于 Session 緩存中
- 持久化對象和資料庫中的相關記錄對應
- Session 在清理緩存時, 會根據持久化對象的屬性變化, 來同步更新資料庫
- 在同一個 Session 執行個體的緩存中, 資料庫表中的每條記錄隻對應唯一的持久化對象
遊離對象(也叫”脫管”)(Detached)
-
- OID 不為 null
- 不再處于 Session 的緩存中
- 一般情況需下, 遊離對象是由持久化對象轉變過來的, 是以在資料庫中可能還存在與它對應的記錄
Session使用以下方法可以使持久化對象轉變成遊離對象:
測試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; | 結束生命周期 | 結束生命周期 |
對象狀态轉化圖
對象狀态的總結
操縱持久化對象-save()
- Session 的 save() 方法使一個臨時對象轉變為持久化對象
- Session 的 save() 方法完成以下操作:
- 把 News 對象加入到 Session 緩存中, 使它進入持久化狀态
- 選用映射檔案指定的辨別符生成器, 為持久化對象配置設定唯一的 OID. 在使用代理主鍵的情況下, setId() 方法為 News 對象設定 OID 使無效的.
- 計劃執行一條 insert 語句,把Customer對象目前的屬性值組裝到insert語句中
- Hibernate 通過持久化對象的 OID 來維持它和資料庫相關記錄的對應關系. 當 News 對象處于持久化狀态時, 不允許程式随意修改它的 ID
操縱持久化對象-update()
- Session 的 update() 方法使一個遊離對象轉變為持久化對象, 并且計劃執行一條 update 語句.
操縱持久化對象-saveOrupdate()
saveOrUpdate:
該方法同時包含save和update方法,如果參數是臨時對象就用save方
法,如果是遊離對象就用update方法,如果是持久化對象就直接傳回。
如果參數是臨時對象就用save方法
如果是遊離對象就用update方法
如果是持久化對象就直接傳回,不執行操作