[转]Spring事务配置在DAO和Service层

Spring事务配置在DAO和Service层

分类: Spring 453人阅读 评论(0) 收藏 举报

【转载自http://www.blogjava.net/hk2000c/archive/2007/11/01/157508.html
【感谢原作者:hk2000c】
Spring通过AOP实现声明式事务管理。通常通过TransactionProxyFactoryBean设置Spring事务代理。我们需要一个目标对象包装在事务代理中。这个目标对象一般是一个普通Java对象的bean。当我们定义TransactionProxyFactoryBean时,必须提供一个相关的 PlatformTransactionManager的引用和事务属性。 事务属性含有上面描述的事务定义。
PlatformTransactionManager:
HibernateTransactionManager需要一个SessionFactory的引用
JtaTransactionManager
一.把事务放置在了DAO层:

Java代码 复制代码  收藏代码
  1. <!—hibernateTransactionManager-->   
  2. <bean id="transactionManager"  
  3.        class="org.springframework.orm.hibernate3.HibernateTransactionManager">   
  4.        <property name="sessionFactory">   
  5.               <ref local="sessionFactory" />   
  6.        </property>   
  7. </bean>   
  8. <!—DAO层接口实现-->   
  9. <bean id="companyDAOTarget"  
  10.        class="com.vstsoft.querycompany.dao.impl.CompanyDAOImpl">   
  11.        <property name="sessionFactory">   
  12.               <ref local="sessionFactory" />   
  13.        </property>   
  14. </bean>   
  15. <!—spring对DAO层的事务代理-->   
  16. <bean id="companyDAOProxy"  
  17.        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">   
  18.        <property name="transactionManager">   
  19.               <ref bean="transactionManager" />   
  20.        </property>   
  21.        <property name="target">   
  22.               <ref local="companyDAOTarget" />   
  23.        </property>   
  24.        <property name="transactionAttributes">   
  25.               <props>   
  26.               <prop key="insert*">PROPAGATION_REQUIRED</prop>   
  27.               <prop key="delete*">PROPAGATION_REQUIRED</prop>   
  28.               <prop key="find*">   
  29.               PROPAGATION_REQUIRED,readOnly   
  30.               </prop>   
  31.               </props>   
  32.        </property>   
  33. </bean>   
  34. <!—业务层接口实现,把DAO注入到Service里面-->   
  35. <bean name="companyManageTarget"  
  36.        class="com.vstsoft.querycompany.service.impl.CompanyManageTarget">   
  37.        <property name="companyDAO">   
  38.               <ref bean="companyDAOProxy" />   
  39.        </property>   
  40. </bean>   
  41. <!—spring对Service层的代理-->   
  42. <bean id="companyManageProxy"  
  43.        class="org.springframework.aop.framework.ProxyFactoryBean">   
  44.        <property name="proxyInterfaces">   
  45.               <value>com.vstsoft.querycompany.service.CompanyManage</value>   
  46.        </property>   
  47.        <property name="target">   
  48.               <ref bean="companyManageTarget" />   
  49.        </property>   
  50. </bean>   
  51. <!—配置struts访问,把service层注入到action里面-->   
  52. <bean name="/company"  
  53.        class="com.vstsoft.querycompany.web.action.CompanyAction" singleton="false">   
  54.        <property name="companyManage">   
  55.               <ref local="companyManageProxy" />   
  56.        </property>   
  57. </bean>  
  1. <!—hibernateTransactionManager-->  
  2. <bean id="transactionManager"  
  3.        class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  4.        <property name="sessionFactory">  
  5.               <ref local="sessionFactory" />  
  6.        </property>  
  7. </bean>  
  8. <!—DAO层接口实现-->  
  9. <bean id="companyDAOTarget"  
  10.        class="com.vstsoft.querycompany.dao.impl.CompanyDAOImpl">  
  11.        <property name="sessionFactory">  
  12.               <ref local="sessionFactory" />  
  13.        </property>  
  14. </bean>  
  15. <!—spring对DAO层的事务代理-->  
  16. <bean id="companyDAOProxy"  
  17.        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
  18.        <property name="transactionManager">  
  19.               <ref bean="transactionManager" />  
  20.        </property>  
  21.        <property name="target">  
  22.               <ref local="companyDAOTarget" />  
  23.        </property>  
  24.        <property name="transactionAttributes">  
  25.               <props>  
  26.               <prop key="insert*">PROPAGATION_REQUIRED</prop>  
  27.               <prop key="delete*">PROPAGATION_REQUIRED</prop>  
  28.               <prop key="find*">  
  29.               PROPAGATION_REQUIRED,readOnly  
  30.               </prop>  
  31.               </props>  
  32.        </property>  
  33. </bean>  
  34. <!—业务层接口实现,把DAO注入到Service里面-->  
  35. <bean name="companyManageTarget"  
  36.        class="com.vstsoft.querycompany.service.impl.CompanyManageTarget">  
  37.        <property name="companyDAO">  
  38.               <ref bean="companyDAOProxy" />  
  39.        </property>  
  40. </bean>  
  41. <!—spring对Service层的代理-->  
  42. <bean id="companyManageProxy"  
  43.        class="org.springframework.aop.framework.ProxyFactoryBean">  
  44.        <property name="proxyInterfaces">  
  45.               <value>com.vstsoft.querycompany.service.CompanyManage</value>  
  46.        </property>  
  47.        <property name="target">  
  48.               <ref bean="companyManageTarget" />  
  49.        </property>  
  50. </bean>  
  51. <!—配置struts访问,把service层注入到action里面-->  
  52. <bean name="/company"  
  53.        class="com.vstsoft.querycompany.web.action.CompanyAction" singleton="false">  
  54.        <property name="companyManage">  
  55.               <ref local="companyManageProxy" />  
  56.        </property>  
  57. </bean>  
<!—hibernateTransactionManager-->
<bean id="transactionManager"
       class="org.springframework.orm.hibernate3.HibernateTransactionManager">
       <property name="sessionFactory">
              <ref local="sessionFactory" />
       </property>
</bean>
<!—DAO层接口实现-->
<bean id="companyDAOTarget"
       class="com.vstsoft.querycompany.dao.impl.CompanyDAOImpl">
       <property name="sessionFactory">
              <ref local="sessionFactory" />
       </property>
</bean>
<!—spring对DAO层的事务代理-->
<bean id="companyDAOProxy"
       class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
       <property name="transactionManager">
              <ref bean="transactionManager" />
       </property>
       <property name="target">
              <ref local="companyDAOTarget" />
       </property>
       <property name="transactionAttributes">
              <props>
              <prop key="insert*">PROPAGATION_REQUIRED</prop>
              <prop key="delete*">PROPAGATION_REQUIRED</prop>
              <prop key="find*">
              PROPAGATION_REQUIRED,readOnly
              </prop>
              </props>
       </property>
</bean>
<!—业务层接口实现,把DAO注入到Service里面-->
<bean name="companyManageTarget"
       class="com.vstsoft.querycompany.service.impl.CompanyManageTarget">
       <property name="companyDAO">
              <ref bean="companyDAOProxy" />
       </property>
</bean>
<!—spring对Service层的代理-->
<bean id="companyManageProxy"
       class="org.springframework.aop.framework.ProxyFactoryBean">
       <property name="proxyInterfaces">
              <value>com.vstsoft.querycompany.service.CompanyManage</value>
       </property>
       <property name="target">
              <ref bean="companyManageTarget" />
       </property>
</bean>
<!—配置struts访问,把service层注入到action里面-->
<bean name="/company"
       class="com.vstsoft.querycompany.web.action.CompanyAction" singleton="false">
       <property name="companyManage">
              <ref local="companyManageProxy" />
       </property>
</bean>



二.把事务放置在了Service层:

Java代码 复制代码  收藏代码
  1. <!—jtaTransactionManager-->   
  2. <bean id="jtaTransactionManager"  
  3.        class="org.springframework.transaction.jta.JtaTransactionManager" />   
  4. <!—DAO层接口实现-->   
  5. <bean id="companyDAOTarget"  
  6.        class="com.vstsoft.querycompany.dao.impl.CompanyDAOImpl">   
  7.        <property name="sessionFactory">   
  8.               <ref local="sessionFactory" />   
  9.        </property>   
  10. </bean>   
  11. <!—spring对DAO层的代理-->   
  12. <bean id="companyDAOProxy"  
  13.        class="org.springframework.aop.framework.ProxyFactoryBean">   
  14.        <property name="proxyInterfaces">   
  15.               <value>com.vstsoft.querycompany.dao.CompanyDAO</value>   
  16.        </property>   
  17.        <property name="target">   
  18.               <ref bean="companyDAOTarget" />   
  19.        </property>   
  20. </bean>   
  21. <!—业务层接口实现,把DAO注入到Service里面-->   
  22. <bean name="companyManageTarget"  
  23.        class="com.vstsoft.querycompany.service.impl.CompanyManageTarget">   
  24.        <property name="companyDAO">   
  25.               <ref bean="companyDAOProxy" />   
  26.        </property>   
  27. </bean>   
  28. <!—spring代理业务层的事务管理-->   
  29. <bean id="companyManageProxy"  
  30.        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">   
  31.        <property name="transactionManager">   
  32.               <ref local="jtaTransactionManager" />   
  33.        </property>   
  34.        <property name="transactionAttributes">   
  35.               <props>   
  36.                      <prop key="set*">PROPAGATION_REQUIRED</prop>   
  37.                      <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>   
  38.               </props>   
  39.        </property>   
  40.        <property name="target">   
  41.               <ref bean="companyManageTarget" />   
  42.        </property>   
  43. </bean>   
  44. <!—配置struts访问,把service层注入到action里面-->   
  45. <bean name="/company"  
  46.        class="com.vstsoft.querycompany.web.action.CompanyAction" singleton="false">   
  47.        <property name="companyManage">   
  48.               <ref local="companyManageProxy" />   
  49.        </property>   
  50. </bean>  
  1. <!—jtaTransactionManager-->  
  2. <bean id="jtaTransactionManager"  
  3.        class="org.springframework.transaction.jta.JtaTransactionManager" />  
  4. <!—DAO层接口实现-->  
  5. <bean id="companyDAOTarget"  
  6.        class="com.vstsoft.querycompany.dao.impl.CompanyDAOImpl">  
  7.        <property name="sessionFactory">  
  8.               <ref local="sessionFactory" />  
  9.        </property>  
  10. </bean>  
  11. <!—spring对DAO层的代理-->  
  12. <bean id="companyDAOProxy"  
  13.        class="org.springframework.aop.framework.ProxyFactoryBean">  
  14.        <property name="proxyInterfaces">  
  15.               <value>com.vstsoft.querycompany.dao.CompanyDAO</value>  
  16.        </property>  
  17.        <property name="target">  
  18.               <ref bean="companyDAOTarget" />  
  19.        </property>  
  20. </bean>  
  21. <!—业务层接口实现,把DAO注入到Service里面-->  
  22. <bean name="companyManageTarget"  
  23.        class="com.vstsoft.querycompany.service.impl.CompanyManageTarget">  
  24.        <property name="companyDAO">  
  25.               <ref bean="companyDAOProxy" />  
  26.        </property>  
  27. </bean>  
  28. <!—spring代理业务层的事务管理-->  
  29. <bean id="companyManageProxy"  
  30.        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
  31.        <property name="transactionManager">  
  32.               <ref local="jtaTransactionManager" />  
  33.        </property>  
  34.        <property name="transactionAttributes">  
  35.               <props>  
  36.                      <prop key="set*">PROPAGATION_REQUIRED</prop>  
  37.                      <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>  
  38.               </props>  
  39.        </property>  
  40.        <property name="target">  
  41.               <ref bean="companyManageTarget" />  
  42.        </property>  
  43. </bean>  
  44. <!—配置struts访问,把service层注入到action里面-->  
  45. <bean name="/company"  
  46.        class="com.vstsoft.querycompany.web.action.CompanyAction" singleton="false">  
  47.        <property name="companyManage">  
  48.               <ref local="companyManageProxy" />  
  49.        </property>  
  50. </bean>  
<!—jtaTransactionManager-->
<bean id="jtaTransactionManager"
       class="org.springframework.transaction.jta.JtaTransactionManager" />
<!—DAO层接口实现-->
<bean id="companyDAOTarget"
       class="com.vstsoft.querycompany.dao.impl.CompanyDAOImpl">
       <property name="sessionFactory">
              <ref local="sessionFactory" />
       </property>
</bean>
<!—spring对DAO层的代理-->
<bean id="companyDAOProxy"
       class="org.springframework.aop.framework.ProxyFactoryBean">
       <property name="proxyInterfaces">
              <value>com.vstsoft.querycompany.dao.CompanyDAO</value>
       </property>
       <property name="target">
              <ref bean="companyDAOTarget" />
       </property>
</bean>
<!—业务层接口实现,把DAO注入到Service里面-->
<bean name="companyManageTarget"
       class="com.vstsoft.querycompany.service.impl.CompanyManageTarget">
       <property name="companyDAO">
              <ref bean="companyDAOProxy" />
       </property>
</bean>
<!—spring代理业务层的事务管理-->
<bean id="companyManageProxy"
       class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
       <property name="transactionManager">
              <ref local="jtaTransactionManager" />
       </property>
       <property name="transactionAttributes">
              <props>
                     <prop key="set*">PROPAGATION_REQUIRED</prop>
                     <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
              </props>
       </property>
       <property name="target">
              <ref bean="companyManageTarget" />
       </property>
</bean>
<!—配置struts访问,把service层注入到action里面-->
<bean name="/company"
       class="com.vstsoft.querycompany.web.action.CompanyAction" singleton="false">
       <property name="companyManage">
              <ref local="companyManageProxy" />
       </property>
</bean>



例如:在service层的接口实现CompanyManageImpl里面有个setData方法:按顺序执行对数据库的数据查询,数据删除,数据插入数据库,如果哪一步出异常(运行时异常),以上三个操作都将事务回滚。

猜你喜欢

转载自justice-jl.iteye.com/blog/1601154