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

Spring 原始碼解析(八):Spring 整合 Hibernate 核心實現機制

     編輯:Java 相關知識

LocalSessionFactoryBean:SessionFactory 建構核心

實作 FactoryBean,getObject() 返回 sessionFactory。afterPropertiesSet() 呼叫 buildSessionFactory() 建構,再以 Proxy 包裝攔截 getCurrentSession()。

buildSessionFactory() 詳細流程

  1. 建立 Hibernate Configuration 實例。
  2. 以 ThreadLocal Holder 綁定資料源、JTA 事務管理器、LobHandler 供配置期使用。
  3. 設定 Hibernate 屬性:連線釋放模式 ON_CLOSE、CurrentSessionContext、攔截器、命名策略、型別定義、過濾器定義。
  4. 載入配置檔 (configLocations)、屬性 (hibernateProperties)、映射資源 (mappingLocations、cacheableMappingLocations、mappingJarLocations、mappingDirectoryLocations)。
  5. 設定快取策略、事件監聽器。
  6. 子類可覆寫 postProcessConfiguration() 客製化。
  7. 呼叫 config.buildSessionFactory() 生成原始 SessionFactory。
  8. 清理 ThreadLocal Holder,可選執行 schemaUpdate。

TransactionAwareSessionFactoryProxy:攔截 getCurrentSession

動態 Proxy 實作 InvocationHandler,攔截 getCurrentSession() 呼叫 SessionFactoryUtils.doGetSession(),其他方法轉發目標 SessionFactory。確保 Spring 事務管理下取得綁定事務的 Session。

SessionFactoryUtils.doGetSession():Session 取得與綁定邏輯

  1. 從 TransactionSynchronizationManager (ThreadLocal) 取得 SessionHolder。
  2. 若存在有效 Session:
     - Spring 事務啟動中 → 註冊同步器 (SpringSessionSynchronization) 實現事務性刷新,調整 FlushMode。
     - 無 Spring 事務 → 嘗試 JTA 同步。
  3. 若無綁定 Session:
     - 開啟新 Session,若事務啟動中 → 綁定至 ThreadLocal、註冊同步器、設定 FlushMode.NEVER (唯讀) 或 AUTO。
     - 無事務 → 嘗試 JTA 同步或拋異常 (allowCreate=false 時)。

HibernateTemplate:執行回調範本

execute(HibernateCallback, exposeNativeSession) 流程:

  1. 取得 Session (getSession() 內部委派 SessionFactoryUtils)。
  2. 判斷是否既有事務綁定,應用 FlushMode、啟用 Filter。
  3. 回調 action.doInHibernate(session) 執行用戶邏輯。
  4. 必要時刷新,捕獲異常轉換為 DataAccessException。
  5. finally 區塊:既有事務不關閉 Session(由同步器管理);無事務則關閉或註冊延遲關閉。

總結

Spring 透過 LocalSessionFactoryBean 統一配置構建 SessionFactory,以動態 Proxy 攔截 getCurrentSession() 實現事務感知 Session 管理,配合 TransactionSynchronizationManager (ThreadLocal) 綁定 Session 生命週期,HibernateTemplate 封裝回調執行與異常轉換,完整解決 Hibernate 整合中的 Session/事務/資源管理難題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved