1. 程式人生 > >Spring配置事務在Dao層和Service層

Spring配置事務在Dao層和Service層

【轉載自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>  


二.把事務放置在了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>  


例如:在service層的介面實現CompanyManageImpl裡面有個setData方法:按順序執行對資料庫的資料查詢,資料刪除,資料插入資料庫,如果哪一步出異常(執行時異常),以上三個操作都將事務回滾。