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

Hibernate Session 緩存機制與對象三大狀態深度解析

     編輯:Java 相關知識

Session 作為 Hibernate 核心 API,其緩存機制與對象狀態流轉是掌握性能調優與避免異常的基石。

一、Session 緩存:一級緩存的「過渡倉庫」

SessionImpl 內部持有多個 Java 集合(entityEntries, collections 等),構成**事務級的一級緩存** 。

核心作用

  • 減少數據庫訪問:同一事務內重複查詢同一實體,直接返回緩存對象
  • 延遲寫入:save()/update() 先寫緩存,flush() 時批量同步到數據庫
  • 保證實體唯一性:同一 Session 內,同一 OID 對應同一 Java 對象引用

形象類比

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()
臨時態 (數據庫記錄刪除)

關鍵認知

  • 狀態相對於具體 Session 實例:對象 A 在 Session1 持久,在 Session2 即為游離
  • OID 神聖不可變:應用層絕不手動修改 ID,由 Hibernate 全權管理,否則破壞緩存-數據庫映射關係
  • 手工構造「假游離態」極危險:new 對象並手動設置 ID 匹配數據庫記錄,會導致 save() 衝突或 update() 覆蓋數據

三、實戰避坑指南

  1. getCurrentSession() 綁定事務上下文,**事務提交/回滾自動關閉**,手動 close() 會導致後續操作報 "Session closed"
  2. openSession() 每次創建新 Session,**需手動管理關閉**,適合長會話/後台任務
  3. 游離對象重新關聯優先用 merge()(複製合併),慎用 update()(直接關聯,若 Session 已有同 OID 對象拋異常)
  4. 大批量操作定期 flush() + clear() 防止緩存 OOM
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved