亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

在Spring中配置Hibernate事務(圖)

2019-11-18 12:56:51
字體:
來源:轉載
供稿:網友

  這篇文章主要探討怎么用SPRing來裝配組件及其事務治理。在J2EE工程里連接到一個簡單的數據庫并不是什么難題,但是假如要綜合組裝企業類的組件就變得復雜了。一個簡單的組件有一個或多個數據庫支撐,所以,我們說到整合兩個或多個的組件時,我們希望能夠維持跨組件的許多數據庫的運作的原子性。
  
  J2EE提供了這些組件的容器,可以保證處理的原子性和獨立性。在沒有J2EE的情況下我們可以用Spring。Spring基于IoC模式(即反轉模式),不僅可以配置組件服務,還可以配置相應的方法。為了更好的實現本文的目的,我們使用Hibernate來做相應的后臺開發。
  
  裝配組件事務
  
  假設在組件庫里,我們已經有一個審核組件(audit component),里面有可以被客戶端調用的方法。接著,當我們想要構建一個處理訂單的體系,我們發現設計需要的OrderListManager組件服務同樣需要審核組件服務。OrderListManager創建和治理訂單,每一個服務都含有自己的事務屬性。當這時調用審核組件,就可以把OrderListManager的處理內容傳給它。也許將來新的業務服務(business service)同樣需要審核組件,那這時它調用的事務內容已經不一樣了。在網絡上的結果就是,雖然審核的功能保持不變,但是可以和別的事件功能組合在一起,用這些方法屬性來提供不同的運行時的處理參數。
  
  在圖1中有兩個分開的調用流程。在流程1里,假如客戶端含有一個TX內容,OrderListManager 要由一個新的TX開始或者參與其中,取決于客戶端在不在TX里以及OrderListManager方法指定的TX屬性。這在它調用AuditManager方法的時候仍然適用。
  
 在Spring中配置Hibernate事務(圖)(圖一)

  
圖1. 裝配組件事務

  
  EJB體系通過裝配者聲明正確的事務屬性來獲得這種適應性。我們不是在探討是否聲明事務治理,因為這會使運行時的事務參數代碼發生改變。幾乎所有的J2EE工程提供了分布的事務治理來配合提交協議例如X/Open XA specification。
  
  現在的問題是我們能不能不用EJB來獲得相同的功能?Spring是其中一種解決方案。來看一下Spring如何處理這樣的問題:
  
  用Spring來治理事務
  
  我們將看到的是一個輕量級的事務機制,實際上,它可以治理組件層的事務集成。Spring就是如此。它的優點是我們可以不用捆綁在J2EE的服務例如JNDI數據庫。最棒的是假如我們想把這個事務機制與已經存在的J2EE框架組合在一起,沒有任何問題,就似乎我們找到了杠桿中完美的支撐點一樣。
  
  Spring的另一個機制是使用了AOP框架。這個框架使用了一個可以使用AOP的Spring bean factory。在Spring特定的配置文件applicationContext.xml里通過特定的組件層的事件來指定。
  
  <beans><!-- other code goes here... -->
  <bean id="orderListManager"    class="org.springframework.transaction .interceptor.TransactionProxyFactoryBean"><property name="transactionManager">
  <ref local="transactionManager1"/></property><property name="target">
  <ref local="orderListManagerTarget"/></property><property name="transactionAttributes">
  <props><prop key="getAllOrderList">            PROPAGATION_REQUIRED        </prop>
  <prop key="getOrderList">            PROPAGATION_REQUIRED        </prop>        <prop key="createOrderList">            PROPAGATION_REQUIRED        </prop>
  <prop key="addLineItem">          PROPAGATION_REQUIRED,          -com.example.exception.FacadeException        </prop>        <prop key="getAllLineItems">            PROPAGATION_REQUIRED,readOnly        </prop>
  <prop key="queryNumberOfLineItems">            PROPAGATION_REQUIRED,readOnly        </prop>
  </props></property></bean></beans>
  
  一旦我們在服務層指定了事務屬性,它們就被一個繼續org.springframework.transaction.PlatformTransactionManager 接口的類截獲. 這個接口如下:
  
  public interface PlatformTransactionManager{    TransactionStatus getTransaction        (TransactionDefinition definition);
  void commit(TransactionStatus status);
  void rollback(TransactionStatus status);}
  
  Hibernate事務治理
  
  一旦我們決定了使用Hibernate作為ORM工具,我們下一步要做的就是用Hibernate特定的事務治理實例來配置。
  
  <beans><!-- other code goes here... --><bean id="transactionManager1"    class="org.springframework.orm.hibernate.        HibernateTransactionManager">
  <property name="sessionFactory">
  <ref local="sessionFactory1"/>
  </property></bean></beans>
  我們來看看什么是“裝配組件事務”,你也許注重到了那個OrderListManager 特有的TX屬性,那個服務層的組件。我們的工程的主要的東西在表2的BDOM里:
  
 在Spring中配置Hibernate事務(圖)(圖二)

  
圖 2. 業務領域對象模型 (BDOM)

  
  為了用實例說明,我們來列出工程里的非功能需求(NFR):
  
  ---事務在數據庫appfuse1里保存。
  ---審核時要登入到另一個數據庫appfuse2里,出于安全的考慮,數據庫有防火墻保護。
  ---事務組件可以重用。
  ---所有訪問事件必須經過在事務服務層的審核。
  
  出于以上的考慮,我們決定了OrderListManager 服務將委托任何審核記錄來調用已有的AuditManager 組件.這產生了表3這樣更細致的結構:
  
 在Spring中配置Hibernate事務(圖)(圖三)

  
圖 3. 組件服務結構設計

  
  值得注重的是,由于我們的NFR,我們要映射OrderListManager相關的事物到appfuse1 數據庫里去,而審核相關的到appfuse2。這樣,任何審核的時候 OrderListManager 組件都會調用AuditManager 組件。我們認為OrderListManager 組件里的所有方法都要執行, 因為我們通過服務來創建次序和具體項目。那么AuditManager 組件里的服務呢? 因為它做的是審核的動作,我們關心的是為系統里所有的事務記錄審核情況。這樣的需求是,“即使事務事件失敗了,我們也要記錄登錄的審核情況”。AuditManager 組件同樣要有自己的事件,因為它同樣與自己的數據庫有關聯。如下所示:
  
  <beans><!—其他代碼在這里--><bean id="auditManager"    class="org.springframework.transaction. interceptor.TransactionProxyFactoryBean">    <property name="transactionManager">        <ref local="transactionManager2"/>    </property>
  <property name="target">        <ref local="auditManagerTarget"/>    </property>
  <property name="transactionAttributes">
  <props>
  <prop key="log">
  PROPAGATION_REQUIRES_NEW
  </prop>
  </props>
  </property></bean></beans>
  
  我們現在把注重力放到這兩個事務createOrderList 和 addLineItem中來,作為我們的試驗。同時注重我們并沒有要求最好的設計——你可能注重到了 addLineItem 方法拋出了 FacadeException, 而 createOrderList 沒有。在產品設計中,你也許希望每一個方法都處理異常。
  public class OrderListManagerImpl
  implements OrderListManager{private AuditManager auditManager;public Long createOrderList (OrderList orderList){
  Long orderId = orderListDAO.        createOrderList(orderList);
  auditManager.log(new AuditObject
  (ORDER + orderId, CREATE));
  return orderId;}public void addLineItem (Long orderId, LineItem lineItem)
  throws FacadeException{
  Long lineItemId = orderListDAO.
  addLineItem(orderId, lineItem);
  auditManager.log(new AuditObject
  (LINE_ITEM + lineItemId, CREATE));
  int numberOfLineItems = orderListDAO.
  queryNumberOfLineItems(orderId);
  if(numberOfLineItems > 2){
  log("Added LineItem " + lineItemId +
  " to Order " + orderId + ";
  But rolling back *** !");
  throw new FacadeException("Make a new
  Order for this line item");
  }
  else{
  log("Added LineItem " + lineItemId +
  " to Order " + orderId + ".");
  }}//其他代碼在這里}
  
  要創建一個這個試驗的異常,我們已經介紹了其他事務規則規定一個特定的次序不能在同一行里包含兩個項目。我們應該注重到createOrderList 和 addLineItem調用了auditManager.log() 方法。你應該也注重到了上面方法中的事務屬性。
  <bean id="orderListManager"
  class="org.springframework.transaction.
  interceptor.TransactionProxyFactoryBean">
  <pro

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品视频—区二区三区免费| 国产精品91一区| 亚洲精品国产拍免费91在线| 亚洲成人1234| 国产精品三级美女白浆呻吟| 亚洲电影免费在线观看| 精品少妇v888av| 自拍亚洲一区欧美另类| 亚洲男人天堂手机在线| 欧美成人免费全部| 日韩高清免费观看| 91最新在线免费观看| 北条麻妃99精品青青久久| 国产99久久精品一区二区 夜夜躁日日躁| 欧美孕妇性xx| 国产精品久久久久av| 色综久久综合桃花网| 欧美天堂在线观看| 日本久久亚洲电影| 亚洲国产欧美一区二区丝袜黑人| 国产一区深夜福利| 亚洲国产成人精品久久久国产成人一区| 日韩欧美中文字幕在线观看| 91精品视频在线播放| 国产男女猛烈无遮挡91| 欧美人交a欧美精品| www.久久草.com| 青草青草久热精品视频在线网站| 久久视频在线播放| 国产精品91免费在线| 久久久噜噜噜久久中文字免| 亚洲视频欧美视频| 国产91精品不卡视频| 久久久999国产精品| 欧洲永久精品大片ww免费漫画| 国内精品久久久久影院优| 日韩欧美精品在线观看| 欧美国产第二页| 亚洲图片在线综合| 成人激情视频在线播放| 97香蕉超级碰碰久久免费的优势| 亚洲一区二区日本| 国模gogo一区二区大胆私拍| 97超碰蝌蚪网人人做人人爽| 96pao国产成视频永久免费| 欧美又大又粗又长| 欧美午夜精品在线| 国产在线视频欧美| 日本久久久久久久久久久| 国产日韩欧美91| 久久影视电视剧免费网站| 国产精品久久久久7777婷婷| 日韩欧美视频一区二区三区| 久久久在线视频| 欧美亚洲成人xxx| 国产一区二区三区在线视频| 中日韩美女免费视频网站在线观看| 亚洲free性xxxx护士hd| 久久久精品一区二区三区| 国产精品日韩欧美大师| 日本精品一区二区三区在线播放视频| 久久久久久久久中文字幕| 久久中文字幕在线| 色婷婷综合成人av| 久久精品电影网| 欧美性猛交视频| 午夜精品久久久久久久99热| 欧美激情中文字幕乱码免费| 91高清视频免费观看| 亚洲欧美国产一本综合首页| 成人国产精品免费视频| 一区二区亚洲精品国产| 高清欧美电影在线| 成人免费黄色网| 精品久久在线播放| 中文字幕日韩av综合精品| 亚洲欧美成人一区二区在线电影| 亚洲精品福利在线| 国产偷国产偷亚洲清高网站| 日韩黄色av网站| 日韩av电影中文字幕| 一本一本久久a久久精品牛牛影视| 日韩视频―中文字幕| 亚洲综合视频1区| 久久99精品国产99久久6尤物| 亚洲一区二区三区成人在线视频精品| 欧美性色视频在线| 日韩美女免费视频| 久久av红桃一区二区小说| 亚洲bt天天射| 成人免费在线网址| 一道本无吗dⅴd在线播放一区| 亚洲成成品网站| 欧美日韩一区二区免费在线观看| 成人性生交大片免费看小说| 欧美精品日韩三级| 精品在线欧美视频| 精品中文字幕在线观看| 欧美激情在线观看视频| 亚洲嫩模很污视频| 日韩精品在线播放| 久久成人18免费网站| 91欧美精品成人综合在线观看| 亚洲第一精品电影| 欧美一级电影在线| 亚洲视频在线观看网站| 国产精品欧美一区二区| 欧美乱人伦中文字幕在线| 在线观看日韩www视频免费| 亚洲欧洲一区二区三区在线观看| 91人人爽人人爽人人精88v| 羞羞色国产精品| 久久成人在线视频| 高清欧美性猛交xxxx黑人猛交| 精品国产拍在线观看| 久久久久久久久久国产精品| 欧美麻豆久久久久久中文| 日韩av中文字幕在线免费观看| 欧美成人sm免费视频| 亚洲国产日韩一区| 久久99国产综合精品女同| 丝袜亚洲欧美日韩综合| 亚洲视频视频在线| 欧美视频免费在线| 亚洲日韩欧美视频一区| 欧美小视频在线观看| 福利二区91精品bt7086| 国产欧美日韩综合精品| 亚洲欧美日韩第一区| 国产精品视频一区国模私拍| 欧美丰满片xxx777| 亚洲成在人线av| 欧美肥臀大乳一区二区免费视频| 中文字幕欧美日韩精品| 亚洲电影免费观看高清完整版在线| 欧美特黄级在线| 国产91成人在在线播放| 国内精久久久久久久久久人| 国产精品高清免费在线观看| 亚洲精品98久久久久久中文字幕| 久久免费视频在线观看| 69**夜色精品国产69乱| 欧美美最猛性xxxxxx| 欧美色xxxx| 久久久国产精品视频| 91精品国产91久久久| 欧美日本在线视频中文字字幕| 日韩在线激情视频| 精品免费在线视频| 色伦专区97中文字幕| 91色在线视频| 国内精品一区二区三区四区| y97精品国产97久久久久久| 亚洲第一男人av| 色樱桃影院亚洲精品影院| 欧美高跟鞋交xxxxxhd| 日韩欧美在线视频| 午夜精品一区二区三区av| 久久久久久久影院| 一区二区三区视频免费| 久久精品国产亚洲7777| 国产精品久久久久7777婷婷| 欧美精品久久久久久久久久| 国产精品香蕉在线观看|