交易是在aop 中一定會被提及的部份,除非你的程式都是單純的報表查詢,否則交易需求是一定會被提到。
在這裡透過aop + annotation 可以超簡單的達成。
spring的xml中要有這幾樣東西。
- <context:annotation-config />
- <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory"></property>
- </bean>
- <tx:annotation-driven transaction-manager="transactionManager" />
最後一行是說,我要用過annotation的方式來設定transaction。如果不加這一行是無法達成用anno 的方式來設定。
(sessionFactory我假設你已經設定好了…)
再來,只要在你想要做交易的地方宣告@transactional即可。
- @Transactional
- public class UserService {
- @Reso urce
- private UsersDAO userDao;
- @Transactional
- public List<Users> list() {
- userDao.addUserErrorTest();
- return userDao.listAll();
- }
- public void testInsertError(){
- }
- }
我userDao裡的這個方法,會故意新增一個成功,另一個失敗,當這樣宣告的時候,此方法裡呼叫的程式將會被視為一次交易,要就是全部成功,否則就是全部失敗。
aop + transaction的顆粒度極限是方法。所以在dao某個方法中,要重新思考,若不需要交易的程式區塊,要再重構出新的方法,畢竟交易是需要佔時間與資源的。
以下補充一下sessionFactory 的設定方式,我的範例是以 jndi 的方式來做。
- <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="hibernateProperties">
- <value>
- hibernate.dialect=org.hibernate.dialect.SQLServerDialect
- hibernate.show_sql=true
- </value>
- </property>
- <property name="annotatedClasses">
- <list>
- <value>entity.Users</value>
- </list>
- </property>
- </bean>
- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
- <property name="jndiName" value="java:comp/env/jdbc/deu"></property>
- </bean>
沒有留言:
張貼留言