在Spring和Hibernate的配置文件中,我們可以對類中的方法進(jìn)行事務(wù)控制,也就是說某個方法中含有多個數(shù)據(jù)庫的寫操作,我們可以通過創(chuàng)建一個Spring中的HibernateTransactionManager實(shí)例,把相應(yīng)的sessionFactory注入到其的sessionFactory屬性中,由事務(wù)聲明的方式進(jìn)行事務(wù)控制。樣例如下:
<bean id="oaTM" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory"><ref bean="oaSessionFactory"/></property>
</bean>
但是這種方式有個局限性,如果該方法中既有調(diào)用Hibernate進(jìn)行存儲,也有通過JdbcTemplate進(jìn)行數(shù)據(jù)庫的寫操作,如果在方法執(zhí)行過程中,寫數(shù)據(jù)發(fā)生異常時,只有納入了事務(wù)管理的通過Hibernate進(jìn)行存儲的數(shù)據(jù)才會回滾,而通過JdbcTemplate方式進(jìn)行操作的數(shù)據(jù)不會進(jìn)行回滾。
原因是Hibernate與JdbcTemplate使用的是不同DBConnection,而且JdbcTemplate未申明相應(yīng)的事務(wù)管理,所以要想在既使用了Hibernate,也使用了JdbcTemplate進(jìn)行數(shù)據(jù)庫存儲操作的方法進(jìn)行事務(wù)管理,需要在Spring的配置文件做適當(dāng)?shù)男薷模瑯永缦拢?nbsp;
<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到同一個事務(wù)里。成立需要幾點(diǎn)條件:
1、使用同一個datasource;
2、事務(wù)交由HibernateTransactionManager管理;
3、相關(guān)dao以及service需要使用runtime exception體系,使用spring提供的exception可以,自己封裝設(shè)計的runtime exception體系也行。