Spring编程式事务

Spring的编程式事物管理直接继承自PlatformTransactionManag er接口。根据不同的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后,数据才真正插入到数据库中。

   工程的其他部分与原来的例子一模一样,执行效果也不变。

你可能感兴趣的:(spring,编程,bean,Hibernate,jdbc)