在Spring和Hibernate的配置文件中,我們可以對類中的方法進行事務控制,也就是說某個方法中含有多個數據庫的寫操作,我們可以通過創建一個Spring中的HibernateTransactionManager實例,把相應的sessionFactory注入到其的sessionFactory屬性中,由事務聲明的方式進行事務控制。樣例如下:
<bean id="oaTM" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory"><ref bean="oaSessionFactory"/></property>
</bean>
但是這種方式有個局限性,如果該方法中既有調用Hibernate進行存儲,也有通過JdbcTemplate進行數據庫的寫操作,如果在方法執行過程中,寫數據發生異常時,只有納入了事務管理的通過Hibernate進行存儲的數據才會回滾,而通過JdbcTemplate方式進行操作的數據不會進行回滾。
原因是Hibernate與JdbcTemplate使用的是不同DBConnection,而且JdbcTemplate未申明相應的事務管理,所以要想在既使用了Hibernate,也使用了JdbcTemplate進行數據庫存儲操作的方法進行事務管理,需要在Spring的配置文件做適當的修改,樣例如下:
<bean id="oaTM" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory"><ref bean="oaSessionFactory"/></property>
<property name="dataSource"><ref bean="oaDataSource"/></property>
</bean>
JdbcTemplate和Hibernate能被wrap到同一個事務里。成立需要幾點條件:
1、使用同一個datasource;
2、事務交由HibernateTransactionManager管理;
3、相關dao以及service需要使用runtime exception體系,使用spring提供的exception可以,自己封裝設計的runtime exception體系也行。