org.springframework.orm.hibernate3.SessionFactoryUtils
Hibernate Session處理協助類,允許事務范圍內的Session重用。同樣提供了異常信息的轉義。
支持受Spring管理及不受Spring管理的JTA事務同步(例如簡單JTA或者EJB CMT),透明的支持事務范圍內的Hibernate Sessions。注意:對於不受Spring管理的JTA事務,必須在Hibernate的配置當中指定JTA的TransactionManagerLookup。
org.springframework.orm.hibernate3.SessionHolder
包裝了Hibernate Session及Hibernate事務的Session holder。在一個給定的Session工廠(SessionFactory)中的Hibernate事務管理對象( HibernateTransactionManager )綁定該類實例至當前線程。
org.springframework.orm.hibernate3.SpringSessionContext
Hibernate 3.1's CurrentSessionContext接口實現類,SessionFactoryUtils通過該類實例獲得spring管理下與當前線程綁定的Session。
Used by Spring's LocalSessionFactoryBean
when told to expose a transaction-aware SessionFactory. This is the default as of Spring 2.5.
你可以自定義不同的CurrentSessionContext接口實現,並在設置SessionFactory工廠時,通過hibernate.current_session_context_class屬性指定您的CurrentSessionContext實現。
org.springframework.orm.hibernate3.LocalSessionFactoryBean
FactoryBean接口創建了Hibernate的Session工廠。這是在spring應用環境中安裝Hibernate Session工廠的常用方式(請參考FactoryBean接口);
通過依賴注入,這個Session工廠可以被傳遞到基於Hibernate支持的Dao中。
對於該類的配置及可以通過xml格式的Hibernate配置文件(通過制定“configLocation”屬性),也可以完全通過該類完成。一個典型的配置總是由
一個或者多個"mappingResources"屬性,"hibernateProperties" 屬性(不是絕對必須的), 和一個“dataSource”屬性(SessionFactory使用)完成。
“dataSource”屬性同樣可以由Hibernate的配置文件指定。但是這里的“dataSource”屬性(指當前類內部的)支持任何基於Spring配置的DataSource,
而不僅僅是Hibernate所依賴的數據庫連接提供者。
從單個數據庫應用到分布式事務,SessionFactory的處理策略適用於大多數的應用。Hibernate事務管理對象或者JTA事務管理對象可用於不同的
場合,JTA事務管理對象僅用於多個數據庫的事務處理。
默認情況下這個工廠對象將會派生出一個事務感知(transaction-aware)的SessionFactory型代理對象。無論使用任何事物管理策略
(local/JTA/EJB CMT)或者任何事物同步機制(Sping/JTA),Spring均可以使數據在使用原生Hibernate Session工廠,getCurrentSession()方法
的同時仍舊可以參與Spring管理的當前事務過程(ThreadLocal)。此外,getCurrentSession()方法對請求范圍內的Session對象(由OpenSessionInViewFilter / OpenSessionInViewInterceptor管理的)提供了完美支持。
org.springframework.orm.hibernate3.HibernateTransactionManager
HibernateTransactionManager是一個為Hibernate Session工廠提供服務的PlatformTransactionManager接口實現。
HibernateTransactionManager和一個綁定在當前線程上的Hibenrate Session對象進行捆綁。SessionFactoryUtils對
象和HibernateTemplate對象可以感知當前線程內的Session對象,並自動參與當前線程內的事務處理。Using either
of those or going through SessionFactory.getCurrentSession() is required for Hibernate access code that needs
to support this transaction handling mechanism.
支持自定義的隔離級別,及Hibernate事務超時設定。
這個事務管理對象很適合於那種使用單Hibernate Session工廠的事務型數據訪問應用,但是它也同樣支持在一個事務中
直接的數據源訪問(例如相同數據源的JDBC代碼訪問)。這樣就允許混合型的應用代碼,例如使用Hibernate訪問,使用
JDBC訪問(並不知道同時使用了Hibernate)!Application code needs to stick to the same simple Connection lookup
pattern as with DataSourceTransactionManager (i.e. DataSourceUtils.getConnection(javax.sql.DataSource) or going
through a TransactionAwareDataSourceProxy).
....................
org.springframework.orm.hibernate3.HibernateAccessor
HibernateTemplate和HibernateInterceptor父類,定義了像SessionFactory,flushing行為等通用屬性。
不要嘗試直接使用該類。請參考HibernateTemplate和HibernateInterceptor.
org.springframework.orm.hibernate3.HibernateInterceptor
這個攔截器在進入方法調用之前為當前線程綁定一個新的Hibernate Session實例,在方法執行完畢之后關閉並移除。
如果當前線程內已存在Session實例(來自HibernateTransactionManager對象或者已被Hibernate攔截器攔截的方法
環境),這個攔截器將會使用已有的Session實例。
應用代碼必須通過SessionFactoryUtils.getSession方法或者更好的方式——Hibernate自己的SessionFactory.getCurrentSession()
方法獲得與當前線程綁定的Session對象。通常情況下,代碼如下所示:
- public void doSomeDataAccessAction() {
- Session session = this.sessionFactory.getCurrentSession();
- ...
- // No need to close the Session or translate exceptions!
- }
- public void doSomeDataAccessAction() {
- Session session = this.sessionFactory.getCurrentSession();
- ...
- // No need to close the Session or translate exceptions!
- }
- public void doSomeDataAccessAction() {
- Session session = this.sessionFactory.getCurrentSession();
- ...
- // No need to close the Session or translate exceptions!
- }
注意:通過委托的SessionFactoryUtils.convertHibernateAccessException方法,攔截器將會自動的將Hibernate異常
轉換成與org.springframework.dao異常體系兼容的異常(像HibernateTemplate那樣)。如果想要獲取原始異常,可
以關閉這個功能。
這個類可以認為是HibernateTemplate回調方法的一個替代方案。優點是:
1)回調方法不需要使用匿名類。
2)在數據訪問的應用代碼中可以拋出任何應用異常。
缺點是依賴額外的攔截配置。然而,需要注意的是,通常情況下,在一個事務內部執行的數據訪問代碼不需要配置該
攔截器。在事務開始的起點將會有一個與線程綁定的Session實例,所以增加這個攔截器僅僅是在需要對Session實例
的屬性微調例如flush模式 - 或者需要異常轉義的時候。
org.springframework.orm.hibernate3.HibernateTemplate
簡化Hibernate數據訪問代碼的輔助類。自動轉換Hibernate原生異常為符合org.springframework.dao異常體系的DataAccessExceptions異常。
最重要execute方法支持實現了HibernateCallback接口的Hibernate訪問代碼。無論是HibernateCallback接口實現或
者其他的調用代碼,無需關心對Session對象的獲取和關閉以及Session對象的生命期異常。對典型的單步驟調用,提
供了多種便利方法(find, load, saveOrUpdate, delete)。
在一個service實現中可以通過一個SessionFactory引用直接獲得該實例,或者在一個應用的上下文環境中獲得一個配
置好的實例作為該service的內部引用。注意:SessionFactory應當永遠以bean的形式被配置在應用的上下文當中,第
一種情況下直接提供給service實現,第二種情況提供模板實例引用。