原本想要先發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的程式碼了

arrow
arrow

    討厭鬼 發表在 痞客邦 留言(1) 人氣()