Spring Hibernate事务配置总结

一、TransactionProxyFactoryBean声明式事务配置

<!-- 事务管理器 -->

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

        <property name="sessionFactory">

            <ref bean="sessionFactory"/>

        </property>

    </bean>

    <!-- 事务代理、所有Bean共享一个代理基类-->

    <bean id="transactionBase" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

        <property name="transactionManager" ref="transactionManager"></property>

        <property name="transactionAttributes">

            <props>

                <prop key="*">PROPAGATION_REQUIRED</prop>

            </props>

        </property>

    </bean>

    <!-- 指定目标业务Bean -->

    <bean id="tempService" parent="transactionBase" >     

        <property name="target" ref="tempServiceTarget" />      

    </bean>

    <bean id="tempServiceTarget"

       class="com.cj.transaction.service.TempService" abstract="false"

       lazy-init="default" autowire="default" dependency-check="default">

       <property name="userDAO">

           <ref bean="userDAO" />

       </property>

       <property name="deptDAO">

           <ref bean="deptDAO" />

       </property>

    </bean>

二、 基于tx/aop声明式事务配置

一、引入aop/tx命名空间

<beans

    xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:aop="http://www.springframework.org/schema/aop"

    xmlns:tx="http://www.springframework.org/schema/tx"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

    http://www.springframework.org/schema/aop

    http://www.springframework.org/schema/aop/spring-aop-2.0.xsd

    http://www.springframework.org/schema/tx

    http://www.springframework.org/schema/tx/spring-tx-2.0.xsd ">

 

二、基于tx/aop配置

<!-- 事务管理器 -->

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

        <property name="sessionFactory">

            <ref bean="sessionFactory"/>

        </property>

    </bean>

    <!-- 通过aop定义事务增强切面 -->

    <aop:config>

        <aop:pointcut id="serviceMethod" expression="execution(* com.cj.transaction.service.*.*(..))"/>

        <aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"/>

    </aop:config>

    <tx:advice id="txAdvice" transaction-manager="transactionManager">

        <tx:attributes>

            <tx:method name="find*" read-only="false"/>

            <tx:method name="add*" rollback-for="Exception"/>

        </tx:attributes>

    </tx:advice>

 

expression="execution(* com.cj.transaction.service.*.*(..))" 中几个通配符的含义:

第一个 * —— 通配 任意返回值类型
第二个 * —— 通配 包com.cj.transaction.service下的任意class
第三个 * —— 通配 包com.cj.transaction.service下的任意class的任意方法
第四个 .. —— 通配 方法可以有0个或多个参数

 

注意:第一个*后面有一个空格

三、 编程式事务

一、使用PlatformTransactionManager

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

        <property name="sessionFactory">

            <ref bean="sessionFactory"/>

        </property>

    </bean>

    <bean id="txDefinition" class="org.springframework.transaction.support.DefaultTransactionDefinition">

        <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"></property>

    </bean>

 

public class TempService {

    private UserDAO userDAO;

    private DeptDAO deptDAO;

    private TransactionDefinition txDefinition;

    private PlatformTransactionManager txManager;

   

    public void setUserDAO(UserDAO userDAO) {

       this.userDAO = userDAO;

    }

    public void setDeptDAO(DeptDAO deptDAO) {

       this.deptDAO = deptDAO;

    }

   

    public void setTxDefinition(TransactionDefinition txDefinition) {

       this.txDefinition = txDefinition;

    }

    public void setTxManager(PlatformTransactionManager txManager) {

       this.txManager = txManager;

    }

    public void addTemp(){

       TransactionStatus status = txManager.getTransaction(txDefinition);//

       try {

           User user = new User();

           Dept dept = new Dept();

           user.setRemark("USERREMARK");

           dept.setRemark("DEPT REMARK");

           userDAO.save(user);

           deptDAO.save(dept);

           txManager.commit(status);//提交事務

       } catch (Exception e) {

           txManager.rollback(status);

           e.printStackTrace();

       }

    }

}

 

二、使用TransactionTemplate

    <bean id="txTemplate" class="org.springframework.transaction.support.TransactionTemplate">

        <property name="transactionManager" ref="transactionManager"></property>

        <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"></property>

    </bean>

 

public class Temp1Service {

    private UserDAO userDAO;

    private DeptDAO deptDAO;

    TransactionTemplate txTemplate;

    public void setUserDAO(UserDAO userDAO) {

       this.userDAO = userDAO;

    }

    public void setDeptDAO(DeptDAO deptDAO) {

       this.deptDAO = deptDAO;

    }

    public void setTxTemplate(TransactionTemplate txTemplate) {

       this.txTemplate = txTemplate;

    }

    public void addTemp(){

       txTemplate.execute(new TransactionCallback(){

           public Object doInTransaction(TransactionStatus status){

              try {

                  User user = new User();

                  Dept dept = new Dept();

                  user.setRemark("USERREMARK");

                  dept.setRemark("DEPT REMARK");

                  userDAO.save(user);

                  deptDAO.save(dept);

              } catch (Exception e) {

                  status.setRollbackOnly();//

                  e.printStackTrace();

                  return false;

              }

              return true;

           }

       });

    }

}


你可能感兴趣的:(spring,Hibernate)