首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Hibernate 實體對象三大狀態詳解:瞬時態、持久態、脫管態轉換圖譜

     編輯:Java 綜合教學

Hibernate 實體對象三大狀態詳解:瞬時態、持久態、脫管態轉換圖譜

Hibernate 管理的實體對象在生命周期中處於三種狀態之一:瞬時態、持久態、脫管態。理解狀態轉換規則是掌握 Session 緩存、脏檢查、級聯操作、樂觀鎖的前提。

三大狀態定義

狀態英文數據庫記錄Session 關聯特徵
瞬時態 Transient 無 無 new 出來,無 ID,非持久化,超出作用域被 GC 回收
持久態 Persistent 有 有 (Session 打開、事務未提交) save/persist/load/get 後,脏檢查生效,事務提交自動同步 DB
脫管態 Detached 有 無 (Session 關閉/清理/evict) 數據庫有記錄但不受 Session 管理,修改不自動同步,需 merge/update

狀態轉換圖譜

Hibernate 對象三種狀態轉換圖

狀態轉換操作對應表

關鍵轉換操作

// 瞬時態 → 持久態
session.save(entity);        // 返回生成的 ID
session.persist(entity);     // JPA 標準,不保證立即生成 ID

// 持久態 → 脫管態
session.close();             // Session 關閉
session.evict(entity);       // 從 Session 緩存移除特定對象
session.clear();             // 清空 Session 緩存

// 脫管態 → 持久態 (重新關聯)
session.update(entity);      // 強制更新,若無對應 DB 記錄拋異常
session.merge(entity);       // 合併:若 Session 已有同 ID 對象,複製狀態並返回持久態實例;否則加載後複製。推薦使用。

// 持久態 → 瞬時態 (刪除)
session.delete(entity);      // 從 DB 刪除,對象變為瞬時態

// 瞬時態/脫管態 → 持久態 (統一)
session.saveOrUpdate(entity); // 根據 ID 判斷:無 ID → save,有 ID → update

脏檢查機制

  • 僅在 持久態 且 事務提交時 觸發。
  • Hibernate 對比對象當前狀態與加載時快照,發現差異生成 UPDATE SQL。
  • save() 前修改屬性 不觸發 脏檢查 (對象尚未持久化)。
  • flush() 可強制同步,但仍在事務中。

面試高頻題:如何判斷對象當前狀態?

依據兩個核心指標:

  1. 是否關聯 Session:session.contains(entity) 返回 true → 持久態。
  2. 數據庫是否有對應記錄:主鍵 ID 是否為 null/未賦值、或執行 session.get(entityClass, id) != null。
// 判斷邏輯
if (entity.getId() == null) return TRANSIENT;
if (session.contains(entity)) return PERSISTENT;
return DETACHED;

最佳實踐

  1. 優先使用 merge() 替代 update(),安全處理脫管態重新關聯。
  2. 長會話模式 下謹慎使用脫管對象,防止數據不一致。
  3. DTO/VO 傳輸層對象不參與 Hibernate 狀態管理,避免混淆。
  4. 事務邊界清晰:Service 層開啟事務,DAO 僅操作 Session,Controller 無 Session 感知。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved