原本想要先發junit的~只是我突然想到
我還沒有配置transcation manager
為什麼要配置這個呢?
當然還是要來講一下例子
很多人都會說~用這個是為了程式出錯時
為了避免資料庫錯亂才要用的
這樣講沒有錯~可是不容易聽懂~
就講一下簡單懂的,常會用到的就ok了
今天你要到台灣銀行轉帳到中華郵政
剛好在你在轉帳的那一個moment
台灣銀行與中華郵政其一個當機了
你的戶頭會有四種可能
1、台灣銀行轉出失敗、中華郵政沒有收到款項~~你沒有損失
2、台灣銀行轉出成功、中華郵政有收到款項~~你沒有損失
3、台灣銀行轉出失敗、中華郵政有收到款項~~你賺到了(不可能!!!!)
4、台灣銀行轉出成功、中華郵政沒有收到款項~~你虧大了~~
當一方出錯時~就要把你的帳戶還原到什麼事都還沒有發生前
這就是transcation manager要做的事情
那要配置在什麼地方呢?
我們在java code時會做資料檢核、商業邏輯、存取資料
在struts2+spring+hibernate的架構中就是對應了
action(controller)、service(manager)、dao
那該transcation要用在哪一層呢?
請先好好思考一下
答案不會是dao
如果你想的是dao那要好好思考一下了
正確答案是service
至於為什麼我就不多講了~有時候多多思考一下
對自己是很有幫助
那就開始來配置吧~
在開始前~這次配置會用到的jar檔有
aopalliance-1.0.jar
org.springframework.aop-3.1.1.RELEASE.jar
aspectjweaver-1.6.8.jar
請先加到WEB-INF>lib裡面
因為我的標題是Spring transaction manager 配置教學
顧名思義就是要用spring來控管 transaction manager
當然也可以在程式裡用
但會比較麻煩~不好管理,每在service多寫一個Method就要重覆寫一遍
所以用spring的話~
一個service只要寫一次就好了喔
因為是要配置的有關service的東西~
所以要用到的是service-context.xml的spring設定檔
加入以下配置
這一段是說transactionManager要管理的sessionFactory是哪一個
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
這一段是說什麼method是只能讀取,什麼method是會被遇而exception會被rollback
討厭鬼這邊的做法是查詢的method只能讀
其它的method遇到錯誤會被rollback
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="doQuery*" read-only="true"/>
<tx:method name="*" rollback-for="java.lang.Exception"/>
</tx:attributes>
</tx:advice>
這一段是說程式從nerdy.service.impl.LeatherServiceImpl進去到出來都沒有問題就會幫你commit
有出錯誤的話就會把資料rollback
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* nerdy.service.impl.LeatherServiceImpl.*(..))"/>
</aop:config>
再來就是Hibernate的部份
之前在對資料庫存取時
都是這樣拿到session的
sessionFactory.openSession()
例如
sessionFactory.openSession().delete(leatherType);
現在要改成
sessionFactory.getCurrentSession().delete(leatherType);
這樣程式就會自己的幫你做transcation
不用每次寫一個method就要再加一次transcation的程式碼了
留言列表