熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Spring系列第2部分:當Hibernate遇上Spring

2013-11-23 20:40:27  來源: Java開源技術 

  Spring AOP
  
  軟件系統通常由多個組件構成每個組件負責一個特定的功能領域但是這些組件也經常承擔它們的核心功能之外的額外責任系統服務(例如日志事務管理和安全性)經常發現自己跑到了別的組件的領域裡而這些組件的核心職責是其他事情結果就是所謂的代碼糾纏或者更簡單點兒說一團糟面向方面編程是一種試圖解決這個問題的編程技術它把關注點的隔離提升為核心的編程概念
  
  使用 AOP 時仍然是在一個地方定義系統的公共功能但是可以聲明性地定義 如何 和 在哪裡 應用這個功能如果對橫切關注點(例如日志和事務管理)進行了模塊化那麼不用修改每個單獨的類就可以向代碼中添加新特性這類模塊化的關注點稱作 方面
  
  您知道麼?
  
  可以在任何 Java? 企業版(JEE) 服務器中使用 Spring 框架的功能而且還可以調整它的大多數功能使其適合不受控環境Spring 的中心焦點就是支持不被束縛在特定 JEEE 服務上的可重用業務和數據訪問對象可以跨 JEE 環境(Web 或企業 JavaBean(EJB))獨立應用程序測試環境等等重用這類對象而不會有任何麻煩
  
  以一個企業應用程序為例這類應用程序通常要求類似於安全性和事務支持的服務顯然可以把這些服務的支持直接編寫到要求服務的每個類當中但是更希望能夠不必為大量事務性上下文編寫同樣的事務處理代碼如果使用 Spring AOP 進行事務處理那麼可以聲明性地安排適當的方法調用而不必逐個安排
  
  Spring AOP 提供了幾個方面可以為 JavaBean 聲明事務例如TransactionProxyFactoryBean 是個方便的代理類能夠攔截對現有類的方法調用並把事務上下文應用到事務 bean在下面的示例中會看到這個類的實際應用
  
  Hibernate
  
  Spring 框架提供了對 HibernateJDO 和 iBATIS SQL Maps 的集成支持Spring 對 Hibernate 的支持是第一級的整合了許多 IOC 的方便特性解決了許多典型的 Hibernate 集成問題框架對 Hibernate 的支持符合 Spring 通用的事務和數據訪問對象(DAO)異常層次結構
  
  Spring 為使用選擇的 OR 映射層來創建數據訪問應用程序提供了支持因為所有東西都設計成一組可重用 JavaBean所以不管選擇什麼技術都能以庫的格式訪問大多數 Spring 的 OR 映射支持 ApplicationContext 或 BeanFactory 內部的 OR 映射的好處是簡化了配置和部署
  
  Hibernate 是 Java 平台上一個功能全面的開源的 OR 映射框架Hibernate 支持開發符合常規 Java 理念的持久性類 —— 包括關聯繼承多態復合以及 Java 集合框架Hibernate 查詢語言(HQL)被設計成 SQL 的一個微型面向對象擴展它是對象和關系世界之間的橋梁Hibernate 也支持用原始 SQL 或基於 Java 的標准和示例查詢表達查詢Hibernate 使用 XML(*hbmxml) 文件把 Java 類映射到表把 JavaBean 屬性映射到數據庫表
  
  通過 JDBC 技術支持所有的 SQL 數據庫管理系統Hibernate 與所有流行的 JEE 應用程序服務器和 Web 容器都很好地集成
  
  實際示例
  
  一個銀行應用程序示例可以讓您自己看到 Spring AOP 和 Hibernate 一起工作有多麼好銀行帳戶用例允許用戶 (Customer) 在一個事務中打開一個或多個銀行帳戶用戶可以申請多個銀行帳戶可以選擇是支票帳戶類型或者是儲蓄帳戶類型
  
  應用程序數據庫(Cloudscape?)容納所有客戶和帳戶信息在這個例子中假設在 Customer 和 Account 類之間存在 :N 的關聯在實際生活場景中關聯可能需要按 m:n 建模才能支持聯合帳戶
  
  由於用戶必須可以在一個事務中申請多個帳戶所以首先要為數據庫交互實現一個 DOA 模式然後要設置 Spring AOP 的 TransactionProxyFactoryBean讓它攔截方法調用並聲明性地把事務上下文應用到 DOA
  
  Hibernate 實踐
  
  在 Spring 框架中像 JDBC DataSource 或 Hibernate SessionFactory 這樣的資源在應用程序上下文中可以用 bean 實現需要訪問資源的應用程序對象只需通過 bean 引用得到這類預先定義好的實例的引用即可(這方面的更多內容在 下一節中)在清單 可以看到示例銀行應用程序的一段摘錄XML 應用程序上下文定義顯示了如何設置 JDBC DataSource並在上面放一個 Hibernate SessionFactory
  
  清單 JDBC DataSource 和 HibernateSessionFactory 連接
  
  <! DataSource Property >
  <bean id=exampleDataSource
  class=monsdbcpBasicDataSource>
  <property name=driverClassName>
  <value>orgapachederbyjdbcEmbeddedDriver</value>
  </property>
  <property name=url>
  <value>jdbc:derby:springexample;create=true</value>
  </property>
  </bean>
  
  <! Database Property >
  <bean id=exampleHibernateProperties
  class=orgspringframewonfigPropertiesFactoryBean>
  <property name=properties>
  <props>
  <prop key=hibernatehbmddlauto>update</prop>
  <prop
  key=hibernatedialect>netsfhibernatedialectDerbyDialect</prop>
  <prop
  key=hibernatequerysubstitutions>true T false F</prop>
  <prop key=hibernateshow_sql>false</prop>
  <prop key=hibernatecpminPoolSize></prop>
  <prop key=hibernatecpmaxPoolSize></prop>
  <prop key=hibernatecptimeout></prop>
  <prop key=hibernatecpmax_statement></prop>
  <prop
  key=hibernatecptestConnectionOnCheckout>false</prop>
  </props>
  </property>
  </bean>
  
  <! Hibernate SessionFactory >
  <bean id=exampleSessionFactory
  class=orgspringframeworkormhibernateLocalSessionFactoryBean>
  <property name=dataSource>
  <ref local=exampleDataSource/>
  </property>
  <property name=hibernateProperties>
  <ref bean=exampleHibernateProperties />
  </property>
  <! OR mapping files >
  <property name=mappingResources>
  <list>
  <value>Customerhbmxml</value>
  <value>Accounthbmxml</value>
  </list>
  </property>
  
  </bean>
  
  清單 顯示了如何為示例應用程序數據庫(是 Cloudscape)配置數據源 bean (exampleDataSource)exampleDatasource 被連接到 Spring Hibernate 的 SessionFactory請注意 *hbmxml 指定了示例應用程序的 OR 映射文件
  
  數據源和會話工廠設置好之後下一步就是在 DAO 中連接在 CustomerDAOImpl 示例中要使用 SessionFactory接下來插入 Spring 的 TransactionProxyFactoryBean它會攔截對應用程序的 CustomerDAOImpl 對象的方法調用並聲明性地在它上面應用事務
  
  在 清單 的這個示例中CustomerDAOImpl 類的 addCustomer 方法是作為事務的一部分執行的有一個事務屬性 PROPAGATION_REQUIRED這個屬性等價於 EJB 容器的 TX_REQUIRED如果想讓這個方法一直在事務中運行可以使用 PROPAGATION_REQUIRED如果事務已經在運行那麼 bean 方法會加入事務否則 Spring 的輕量級事務管理器會啟動一個事務如果想在調用組件服務時總是啟動新事務可以使用 PROPAGATION_REQUIRES_NEW 屬性
  
  應用程序的連接完成之後現在來進一步查看源代碼
  
  分析這個!
  
  如果以前沒這麼做過那麼請 下載這篇文章的源代碼把源 zip 文件釋放到計算機中的任何位置上例如 c:\會創建一個叫作 SpringProjectPart 的文件夾src\spring 文件夾包含示例應用程序的 Hibernate 映射文件和 Spring 配置文件src\springexample\hibernate 文件包含應用程序的源代碼
  
  在這裡會發現兩個類即 Customer 和 Account它們用 Hibernate 映射文件映射到兩個表Customer 類代表客戶信息Account 代表客戶的帳戶信息正如前面提到的我把這兩個類按照 : N 關系進行建模即一個 Customer 可以擁有多個 Account清單 顯示了 Customer 對象的 Hibernate 映射文件
  
  清單 Customer 對象的 Hibernate 映射文件
  
  <?xml version=?>
  
  <!DOCTYPE hibernatemapping PUBLIC
  //Hibernate/Hibernate Mapping DTD //EN
  mappingdtd>
  
  <hibernatemapping>
  <class
  name=springexamplehibernateCustomer
  table=TBL_CUSTOMER
  dynamicupdate=false
  dynamicinsert=false>
  
  <id
  name=id
  column=CUSTOMER_ID
  type=javalangLong
  unsavedvalue=
  >
  <generator class=native>
  </generator>
  </id>

From:http://tw.wingwit.com/Article/program/Java/ky/201311/28882.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.