本文為Hibernate官方文檔筆記第二部分,深入剖析Contextual Sessions、Configuration、SessionFactory獲取與JDBC連接封裝四大核心主題。
眾多應用需要將Hibernate Session綁定至特定上下文(請求、會話、事務)。上下文範圍定義隨架構而異:
ThreadLocal模式(如HibernateUtil)或依賴Spring/Pico等第三方框架代理攔截。SessionFactory.getCurrentSession(),初期綁定JTA事務上下文。org.hibernate.context.CurrentSessionContext介面與hibernate.current_session_context_class配置參數。前兩者實現經典Session-per-Request模式(一個Session對應一個資料庫事務)。程式化事務建議使用Hibernate Transaction API;JTA環境使用JTA介面;CMT容器中透過聲明式事務無需代碼干預。
配置範例:hibernate.current_session_context_class=jta|thread|managed或完整類名。未配置但設有TransactionManagerLookup時,為向後兼容預設使用JTASessionContext。
org.hibernate.cfg.Configuration代表應用的完整對象/關係映射元數據,用於構建不可變的SessionFactory。配置來源四選一:
cfg.addResource("mapping.hbm.xml") / cfg.addClass(Entity.class)java.util.Properties傳遞setProperties()hibernate.propertiesjava -Dproperty=valuehibernate.cfg.xml中<property>標籤關鍵特性:Configuration為啟動時臨時對象,SessionFactory建立後即可丟棄,不可在運行期修改映射元數據。
SessionFactory sessionFactory = cfg.buildSessionFactory();
SessionFactory實例(多数據庫場景)Session session = sessionFactory.openSession(); // 需要時從池獲取連接
hibernate.connection.driver_class
hibernate.connection.url
hibernate.connection.username
hibernate.connection.password
hibernate.connection.pool_size -- 內建簡易池,非生產級
警告:Hibernate內建連接池算法未優化,生產環境必須替換為C3P0、Proxool、HikariCP等專業連接池。啟用C3P0僅需配置hibernate.c3p0.*屬性即可自動切換C3P0ConnectionProvider。
hibernate.connection.datasource -- JNDI名稱
hibernate.jndi.url -- 可選,JNDI提供者URL
hibernate.jndi.class -- 可選,InitialContext工廠類
hibernate.connection.username -- 可選
hibernate.connection.password -- 可選
實現org.hibernate.connection.ConnectionProvider介面,並配置hibernate.connection.provider_class指向實現類,完全掌控連接獲取/釋放邏輯。