Spring的编程式事物管理直接继承自PlatformTransactionManager接口。根据不同的Dao技术,Spring提供了不同的PlatformTransactionManager实现类,这里只介绍针对Hibernate的实现方式,如下:
在应用中我们可以直接使用HibernateTransactionManager的实例进行事物管理
。/WEB-INF/mvc-config.xml 和上个例子没有什么不同,下面是
/WEB-INF/data-access.xml :
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd ">
<beans> <!--PropertyPlaceholderConfigurer--> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>WEB-INF/props/jdbc.properties</value> </list> </property> </bean> <!--org.apache.commons.dbcp.BasicDataSource has the connect pool--> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>${jdbc.driverClassName}</value> </property> <property name="url"> <value>${jdbc.url}</value> </property> <property name="username"> <value>${jdbc.username}</value> </property> <property name="password"> <value>${jdbc.password}</value> </property> </bean>
<!--sessionFactory--> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" destroy-method="close"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="mappingResources"> <list> <value>com/yangsq/orm/user.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> ${hibernate.dialect} </prop> </props> </property> </bean>
<!--HibernateTransactionManager--> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> <!--userDao--> <bean id="userDao" class="com.yangsq.dao.impl.UserDaoImpl" init-method="createTransactionDefinition"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> <property name="transactionManager"> <ref local="transactionManager"/> </property> </bean> </beans>
定义了一个HibernateTransactionManager的实例,并把它注入到我们要进行事物管理的UserDaoImpl类。在bean的管理周期中,bean的初始化顺序是生成bean实例(构造方法),执行setter注入,执行init-method属性定义的函数(简化版,呵呵:)。我们针对以前的UserDaoImpl类进行修改,增加事物管理代码部分,如下:
import java.util.List;
import org.springframework.dao.DataAccessException; import org.springframework.orm.hibernate3.HibernateTransactionManager; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.springframework.transaction.support.DefaultTransactionDefinition; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus;
import com.yangsq.dao.UserDao; import com.yangsq.domain.User;
public class UserDaoImpl extends HibernateDaoSupport implements UserDao { private HibernateTransactionManager transactionManager; private DefaultTransactionDefinition def; public HibernateTransactionManager getTransactionManager() { return transactionManager; } public void setTransactionManager(HibernateTransactionManager transactionManager) { this.transactionManager = transactionManager; } public void createTransactionDefinition(){ def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); } public void saveOrUpdate(User user){ TransactionStatus status = transactionManager.getTransaction(def); try{ this.getHibernateTemplate().saveOrUpdate(user); }catch(DataAccessException ex){ transactionManager.rollback(status); throw ex; } transactionManager.commit(status); } ...... }
生成UserDaoImpl实例后,注入transactionManager方法,然后执行createTransactionDefinition,在这个函数里,定义了事物的一些参数,如传播行为,隔离级别等。下面是TransactionDefinition的继承图谱及主要参数:
在调用transactionManager的getTransaction方法后,返回一个TansactionStatus实例,TansactionStatus接口定义了事物执行时的状态。执行saveOrUpdate溢出后,将回滚(rollback),否则提交(commit)。
在实际断点执行时(断点在saveOrUpdate处),执行完saveOrUpdate,察看数据库后,数据并没有插入,只有当执行完transactionManager.commit后,数据才真正插入到数据库中。
工程的其他部分与原来的例子一模一样,执行效果也不变。
http://blog.sina.com.cn/s/blog_4b86f2ee01000784.html