Hibernate 管理的實體對象在生命周期中處於三種狀態之一:瞬時態、持久態、脫管態。理解狀態轉換規則是掌握 Session 緩存、脏檢查、級聯操作、樂觀鎖的前提。
| 狀態 | 英文 | 數據庫記錄 | Session 關聯 | 特徵 |
|---|---|---|---|---|
| 瞬時態 | Transient | 無 | 無 | new 出來,無 ID,非持久化,超出作用域被 GC 回收 |
| 持久態 | Persistent | 有 | 有 (Session 打開、事務未提交) | save/persist/load/get 後,脏檢查生效,事務提交自動同步 DB |
| 脫管態 | Detached | 有 | 無 (Session 關閉/清理/evict) | 數據庫有記錄但不受 Session 管理,修改不自動同步,需 merge/update |


// 瞬時態 → 持久態 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
save() 前修改屬性 不觸發 脏檢查 (對象尚未持久化)。flush() 可強制同步,但仍在事務中。依據兩個核心指標:
session.contains(entity) 返回 true → 持久態。session.get(entityClass, id) != null。// 判斷邏輯 if (entity.getId() == null) return TRANSIENT; if (session.contains(entity)) return PERSISTENT; return DETACHED;
merge() 替代 update(),安全處理脫管態重新關聯。