Session 作為 Hibernate 核心 API,其緩存機制與對象狀態流轉是掌握性能調優與避免異常的基石。
SessionImpl 內部持有多個 Java 集合(entityEntries, collections 等),構成**事務級的一級緩存** 。
save()/update() 先寫緩存,flush() 時批量同步到數據庫Session 緩存 = 英雄背包;數據庫 = 商店;實體對象 = 藥水/卷軸。
需要時先看背包(緩存),無則去商店(數據庫)購買。但不同於遊戲,Hibernate 允許「向商店新增存貨」(持久化新實體)。
| 狀態 | 特徵 | 典型場景 |
|---|---|---|
| 臨時態 | 無 OID、未關聯 Session、數據庫無記錄 | new Entity() 剛創建 |
| 持久態 | 有 OID、在 Session 緩存中、數據庫有對應記錄 | save()、get()、load() 後 |
| 游離態 | 有 OID、脫離 Session 緩存、數據庫可能有記錄 | Session close()/evict()、序列化傳輸後 |
new() → 臨時態
↓ save()/persist()
持久態 ←→ 游離態 (close/evict ↔ update/merge/lock)
↓ delete()
臨時態 (數據庫記錄刪除)
save() 衝突或 update() 覆蓋數據getCurrentSession() 綁定事務上下文,**事務提交/回滾自動關閉**,手動 close() 會導致後續操作報 "Session closed"openSession() 每次創建新 Session,**需手動管理關閉**,適合長會話/後台任務merge()(複製合併),慎用 update()(直接關聯,若 Session 已有同 OID 對象拋異常)flush() + clear() 防止緩存 OOM