Spring配置事務在Dao層和Service層
阿新 • • 發佈:2018-12-30
【轉載自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程式碼
二.把事務放置在了Service層:
Java程式碼
例如:在service層的介面實現CompanyManageImpl裡面有個setData方法:按順序執行對資料庫的資料查詢,資料刪除,資料插入資料庫,如果哪一步出異常(執行時異常),以上三個操作都將事務回滾。
【感謝原作者:hk2000c】
Spring通過AOP實現宣告式事務管理。通常通過TransactionProxyFactoryBean設定Spring事務代理。我們需要一個目標物件包裝在事務代理中。這個目標物件一般是一個普通Java物件的bean。當我們定義TransactionProxyFactoryBean時,必須提供一個相關的 PlatformTransactionManager的引用和事務屬性。 事務屬性含有上面描述的事務定義。
PlatformTransactionManager:
HibernateTransactionManager需要一個SessionFactory的引用
JtaTransactionManager
一.把事務放置在了DAO層:
Java程式碼
- <!—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程式碼
- <!—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方法:按順序執行對資料庫的資料查詢,資料刪除,資料插入資料庫,如果哪一步出異常(執行時異常),以上三個操作都將事務回滾。