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

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

Spring 系列:當 Hibernate 遇上 Spring

2019-11-18 16:10:51
字體:
來源:轉載
供稿:網友
Naveen Balani 繼續他的 SPRing 系列,介紹把 Hibernate 事務與 Spring 面向方面編程(AOP)集成的知識。結果是一個可以依靠的持久性框架。

在這個系列的 前一期中,我介紹了 Spring 框架的 7 個模塊,包括 Spring AOP 和控制反轉(IOC)容器。然后我用一個簡單的示例演示了 IOC 模式(由 Spring IOC 容器實現)如何用松散耦合的方式集成分散的系統。

現在,我從我上次結束的地方開始,采用與上次類似的示例,演示 Spring AOP 和 Spring Hibernate 持久性支持的聲明性事務處理,所以我首先從對這兩項技術的深入研究開始。

下載這篇文章的源代碼。請參閱 參考資料 訪問 Spring 框架和 Apache Ant,運行這篇文章的示例應用程序需要它們。

Spring AOP

軟件系統通常由多個組件構成,每個組件負責一個特定的功能領域。但是,這些組件也經常承擔它們的核心功能之外的額外責任。系統服務(例如日志、事務管理和安全性)經常發現自己跑到了別的組件的領域里,而這些組件的核心職責是其他事情。結果就是所謂的“代碼糾纏”,或者更簡單點兒說“一團糟”。面向方面編程是一種試圖解決這個問題的編程技術,它把關注點的隔離提升為核心的編程概念。

使用 AOP 時,仍然是在一個地方定義系統的公共功能,但是可以聲明性地定義 如何在哪里 應用這個功能。如果對橫切關注點(例如日志和事務管理)進行了模塊化,那么不用修改每個單獨的類,就可以向代碼中添加新特性。這類模塊化的關注點稱作 方面

Spring 系列:當 Hibernate 遇上 Spring(圖一)您知道么?

可以在任何 java™ 企業版(J2EE) 服務器中使用 Spring 框架的功能。而且,還可以調整它的大多數功能,使其適合不受控環境。Spring 的中心焦點就是支持不被束縛在特定 J2EEE 服務上的可重用業務和數據訪問對象??梢钥?J2EE 環境(Web 或企業 JavaBean(EJB))、獨立應用程序、測試環境等等重用這類對象,而不會有任何麻煩。

以一個企業應用程序為例。這類應用程序通常要求類似于安全性和事務支持的服務。顯然,可以把這些服務的支持直接編寫到要求服務的每個類當中,但是更希望能夠不必為大量事務性上下文編寫同樣的事務處理代碼。如果使用 Spring AOP 進行事務處理,那么可以聲明性地安排適當的方法調用,而不必逐個安排。

Spring AOP 提供了幾個方面,可以為 JavaBean 聲明事務。例如,TransactionProxyFactoryBean 是個方便的代理類,能夠攔截對現有類的方法調用,并把事務上下文應用到事務 bean。在下面的示例中會看到這個類的實際應用。


Spring 系列:當 Hibernate 遇上 Spring(圖二)Spring 系列:當 Hibernate 遇上 Spring(圖三)
回頁首

Hibernate

Spring 框架提供了對 Hibernate、JDO 和 iBATIS SQL Maps 的集成支持。Spring 對 Hibernate 的支持是第一級的,整合了許多 IOC 的方便特性,解決了許多典型的 Hibernate 集成問題??蚣軐?Hibernate 的支持符合 Spring 通用的事務和數據訪問對象(DAO)異常層次結構。

Spring 為使用選擇的 OR 映射層來創建數據訪問應用程序提供了支持。因為所有東西都設計成一組可重用 JavaBean,所以不管選擇什么技術,都能以庫的格式訪問大多數 Spring 的 OR 映射支持。 applicationContextBeanFactory 內部的 OR 映射的好處是簡化了配置和部署。

Hibernate 是 Java 平臺上一個功能全面的、開源的 OR 映射框架。Hibernate 支持開發符合常規 Java 理念的持久性類 —— 包括關聯、繼承、多態、復合以及 Java 集合框架。Hibernate 查詢語言(HQL)被設計成 SQL 的一個微型面向對象擴展,它是對象和關系世界之間的橋梁。Hibernate 也支持用原始 SQL 或基于 Java 的標準和示例查詢表達查詢。Hibernate 使用 xml*.hbm.xml) 文件把 Java 類映射到表,把 JavaBean 屬性映射到數據庫表。

通過 JDBC 技術,支持所有的 SQL 數據庫管理系統。Hibernate 與所有流行的 J2EE 應用程序服務器和 Web 容器都很好地集成。


Spring 系列:當 Hibernate 遇上 Spring(圖二)Spring 系列:當 Hibernate 遇上 Spring(圖三)
回頁首


實際示例

一個銀行應用程序示例可以讓您自己看到 Spring AOP 和 Hibernate 一起工作有多么好。銀行帳戶用例允許用戶 (Customer) 在一個事務中打開一個或多個銀行帳戶。用戶可以申請多個銀行帳戶,可以選擇是支票帳戶類型或者是儲蓄帳戶類型。

應用程序數據庫(Cloudscape™)容納所有客戶和帳戶信息。在這個例子中,假設在 CustomerAccount 類之間存在 1:N 的關聯。在實際生活場景中,關聯可能需要按 m:n 建模,才能支持聯合帳戶。

由于用戶必須可以在一個事務中申請多個帳戶,所以首先要為數據庫交互實現一個 DOA 模式。然后要設置 Spring AOP 的 TransactionProxyFactoryBean,讓它攔截方法調用并聲明性地把事務上下文應用到 DOA。


Spring 系列:當 Hibernate 遇上 Spring(圖二)Spring 系列:當 Hibernate 遇上 Spring(圖三)
回頁首

Hibernate 實踐

在 Spring 框架中,像 JDBC DataSource 或 Hibernate sessionFactory 這樣的資源,在應用程序上下文中可以用 bean 實現。需要訪問資源的應用程序對象只需通過 bean 引用得到這類預先定義好的實例的引用即可(這方面的更多內容在 下一節中)。在清單 1 中,可以看到示例銀行應用程序的一段摘錄:XML 應用程序上下文定義顯示了如何設置 JDBC DataSource,并在上面放一個 Hibernate SessionFactory。


清單 1. JDBC DataSource 和 HibernateSessionFactory 連接
<!-- DataSource Property --><bean id="exampleDataSource"     class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName">   <value>org.apache.derby.jdbc.EmbeddedDriver</value> </property> <property name="url">   <value>jdbc:derby:springexample;create=true</value> </property></bean> <!-- Database Property --><bean id="exampleHibernateProperties"  class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="properties">  <props>   <prop key="hibernate.hbm2ddl.auto">update</prop>   <prop     key="hibernate.dialect">net.sf.hibernate.dialect.DerbyDialect</prop>   <prop     key="hibernate.query.substitutions">true 'T', false 'F'</prop>   <prop key="hibernate.show_sql">false</prop>   <prop key="hibernate.c3p0.minPoolSize">5</prop>   <prop key="hibernate.c3p0.maXPoolSize">20</prop>   <prop key="hibernate.c3p0.timeout">600</prop>   <prop key="hibernate.c3p0.max_statement">50</prop>   <prop      key="hibernate.c3p0.testConnectionOnCheckout">false</prop>  </props> </property></bean><!-- Hibernate SessionFactory --><bean id="exampleSessionFactory"    class="org.springframework.orm.hibernate.LocalSessionFactoryBean"> <property name="dataSource">     <ref local="exampleDataSource"/> </property> <property name="hibernateProperties">     <ref bean="exampleHibernateProperties" /> </property> <!--  OR mapping files. --> <property name="mappingResources">    <list>       <value>Customer.hbm.xml</value>       <value>Account.hbm.xml</value>    </list> </property></bean>


清單 1 顯示了如何為示例應用程序數據庫(是 Cloudscape)配置數據源 bean (exampleDataSource)。exampleDatasource 被連接到 Spring Hibernate 的 SessionFactory。請注意 *.hbm.xml 指定了示例應用程序的 OR 映射文件。

數據源和會話工廠設置好之后,下一步就是在 DAO 中連接,在 CustomerDAOImpl 示例中,要使用 SessionFactory。接下來,插入 Spring 的 TransactionProxyFactoryBean,它會攔截對應用程序的 CustomerDAOImpl 對象的方法調用,并聲明性地在它上面應用事務。

清單 2 的這個示例中,CustomerDAOImpl 類的 addCustomer 方法是作為事務的一部分執行的,有一個事務屬性 PROPAGATION_REQUIRED。這個屬性等價于 EJB 容器的 TX_REQUIRED。如果想讓這個方法一直在事務中運行,可以使用 PROPAGATION_REQUIRED。如果事務已經在運行,那么 bean 方法會加入事務,否則 Spring 的輕量級事務管理器會啟動一個事務。如果想在調用組件服務時總是啟動新事務,可以使用 PROPAGATION_REQUIRES_NEW 屬性。

應用程序的連接完成之后,現在來進一步查看源代碼。


Spring 系列:當 Hibernate 遇上 Spring(圖二)Spring 系列:當 Hibernate 遇上 Spring(圖三)
回頁首

分析這個!

如果以前沒這么做過,那么請 下載這篇文章的源代碼。把源 zip 文件釋放到計算機中的任何位置上,例如 c:/。會創建一個叫作 SpringProjectPart2 的文件夾。src/spring 文件夾包含示例應用程序的 Hibernate 映射文件和 Spring 配置文件。src/springexample/hibernate 文件包含應用程序的源代碼。

在這里會發現兩個類,即 CustomerAccount,它們用 Hibernate 映射文件映射到兩個表。Customer 類代表客戶信息,Account 代表客戶的帳戶信息。正如前面提到的,我把這兩個類按照 1: N 關系進行建模,即一個 Customer 可以擁有多個 Account。清單 3 顯示了 Customer 對象的 Hibernate 映射文件。


清單 3. Customer 對象的 Hibernate 映射文件
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC         "-//Hibernate/Hibernate Mapping DTD 2.0//EN"          "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"><hibernate-mapping>   <class      name="springexample.hibernate.Customer"      table="TBL_CUSTOMER"      dynamic-update="false"      dynamic-insert="false">      <id         name="id"         column="CUSTOMER_ID"         type="java.lang.Long"         unsaved-value="-1"      >         <generator class="native">         </generator>      </id>      <set name ="accounts"         inverse = "true"         cascade="all-delete-orphan">         <key column ="CUSTOMER_ID"/>         <one-to-many class="springexample.hibernate.Account"/>      </set>      <property         name="email"         type="string"         update="false"         insert="true"         column="CUSTOMER_EMAIL"         length="82"         not-null="true"      />      <property         name="passWord"         type="string"         update="false"         insert="true"         column="CUSTOMER_PASSWORD"         length="10"         not-null="true"      />      <property         name="userId"         type="string"         update="false"         insert="true"         column="CUSTOMER_USERID"         length="12"         not-null="true"         unique="true"      />      <property         name="firstName"         type="string"         update="false"         insert="true"         column="CUSTOMER_FIRSTNAME"         length="25"         not-null="true"      />      <property         name="lastName"         type="string"         update="false"         insert="true"         column="CUSTOMER_LASTTNAME"         length="25"         not-null="true"        />   </class></hibernate-mapping>


set name="accounts" 和一對多類標簽指定了 CustomerAccount 之間的關系。我還在 Account.hbm.xml 文件中定義了 Account 對象的映射。

CustomerDAOImpl.java 代表應用程序的 DAO,它在應用程序數據庫中插入客戶和帳戶信息。CustomerDAOImpl 擴展了 Spring 的 HibernateDaoSupport,它用 Spring HibernateTemplate 簡化了會話管理。這樣,可以通過 getHibernateTemplate() 方法保存或檢索數據。下面顯示的 getCustomerAccountInfo()Customer 進行 查找,通過 getHibernateTemplate().find 方法用 HQL 得到客戶的帳戶信息,如清單 4 所示。


清單 4. DAO 實現
public class CustomerDAOImpl extends HibernateDaoSupport            implements CustomerDAO{  public void addCustomer(Customer customer) {    getHibernateTemplate().save(customer);    // TODO Auto-generated method stub  }  public Customer getCustomerAccountInfo(Customer customer) {    Customer cust = null;    List list = getHibernateTemplate().find("from Customer customer " +          "where customer.userId = ?" ,          customer.getUserId(),Hibernate.STRING);     if(list.size() > 0){          cust = (Customer)  list.get(0);    }    return cust;  }

所有這些都應當很容易掌握?,F在來看代碼的實際應用!


Spring 系列:當 Hibernate 遇上 Spring(圖二)Spring 系列:當 Hibernate 遇上 Spring(圖三)
回頁首

運行應用程序

要運行示例應用程序,必須首先 下載 Spring 框架 和它的全部依賴文件。接下來,釋放框架到某一位置(比如 c:/ ),這會創建文件夾 C:/spring-framework-1.2-rc2(針對當前發行版)。在繼續之前還必須下載和釋放 Apache AntCloudscape。下載 Cloudscape 之后,把它釋放到 c:/ ,這會創建文件夾 C:/Cloudscape_10.0。

接下來,釋放源代碼到 c:/ ,這會創建 SpringProject2 文件夾。接下來修改 build.xml 文件的入口,用實際安裝 Spring 的位置代替 C:/spring-framework-1.2-rc2,用實際安裝 Cloudscape 的位置代替 C:/Program Files/IBM/Cloudscape_10.0。

打開命令行提示符,進入 SpringProject 目錄,在命令行提示符下輸入以下命令:build.

這會構建并運行 CreateBankCustomerClient 類,它會創建 Customer 類對象,用數據填充它,創建 Account 對象,填充它,并把它添加到 Customer 對象。

然后 CreateBankCustomerClient 會調用 CustomerDAOImpl.addCustomer 類,添加客戶和帳戶信息。一旦插入完成,CreateBankCustomerClient 會調用 CustomerDAOImpl.getCustomerAccountInfo 方法,根據 userid 得到客戶和帳戶信息。如果 CreateBankCustomerClient 執行成功,會在控制臺上看到打印出 userid。也可以查詢 Cloudscape 數據庫檢索客戶和帳戶信息。


Spring 系列:當 Hibernate 遇上 Spring(圖二)Spring 系列:當 Hibernate 遇上 Spring(圖三)
回頁首


結束語

在三部分的 Spring 系列 的第 2 部分中,我介紹了如何集成 Spring Hibernate 和 Spring AOP。結果是一個強健的持久性框架,支持聲明性的實現事務。

在這個系列的下一篇,也是最后一篇文章中,我將介紹 Spring 的 MVC 模塊,介紹如何用它來簡化基于 Web 的應用程序的創建。

(出處:http://www.49028c.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩免费观看网站| 亚洲xxx视频| 亚洲女人天堂色在线7777| 国产视频精品在线| 在线日韩精品视频| 国产精品视频久久久| 国内精品小视频在线观看| 日韩精品中文字幕在线观看| 日韩欧美成人区| 欧美激情区在线播放| 日韩av免费在线看| 亚洲图片欧洲图片av| 亚洲国产日韩欧美在线图片| www.色综合| 精品伊人久久97| 久久91亚洲精品中文字幕奶水| 亚洲一区二区三区777| 久久久国产精品免费| 日韩免费观看在线观看| 91免费看片网站| 亚洲系列中文字幕| 久久久久久久一区二区| 久久精品国产69国产精品亚洲| 中文字幕亚洲国产| 2019中文字幕全在线观看| 国产精品高清免费在线观看| 久久视频国产精品免费视频在线| 国产精品久久久久91| 性欧美亚洲xxxx乳在线观看| 日韩性xxxx爱| 亚洲男人天堂久| 美女视频黄免费的亚洲男人天堂| 亚洲精品国产综合区久久久久久久| 久久久视频精品| 欧美日韩国产限制| 秋霞成人午夜鲁丝一区二区三区| 欧美黄色片在线观看| 亚洲国产精品va在看黑人| 久久久久久网站| yw.139尤物在线精品视频| 欧洲亚洲妇女av| 欧美极品少妇xxxxⅹ裸体艺术| 国产午夜一区二区| 亚洲国产精品成人一区二区| 热久久视久久精品18亚洲精品| 国产精品xxx视频| 日韩在线视频线视频免费网站| 2020久久国产精品| 中文字幕日韩有码| 中文一区二区视频| 亚洲aaa激情| 久久精品精品电影网| 日韩免费在线看| 久久久精品2019中文字幕神马| 午夜精品蜜臀一区二区三区免费| www.久久久久久.com| 欧美一级片免费在线| 国产精品国产自产拍高清av水多| 欧美小视频在线观看| 国产欧美最新羞羞视频在线观看| 国产视频精品一区二区三区| 国产精品自产拍高潮在线观看| 亚洲国产精品推荐| 久久久精品国产网站| 亚洲日本欧美中文幕| 蜜臀久久99精品久久久久久宅男| 日韩美女在线观看一区| 午夜剧场成人观在线视频免费观看| 亚洲码在线观看| 国产精品永久免费| 91国偷自产一区二区三区的观看方式| 亚洲成人教育av| 久久久999精品视频| 亚洲国产精品人久久电影| 九九精品在线播放| 国产精品第一页在线| 韩国三级日本三级少妇99| 久久天堂av综合合色| 日韩中文字幕在线| 97久久伊人激情网| 亚洲永久在线观看| 日韩精品在线第一页| 91精品国产91久久久久| 国产亚洲一区二区精品| 日韩在线观看免费| 欧美一区二区三区四区在线| 久久久亚洲网站| 精品呦交小u女在线| 日韩最新中文字幕电影免费看| 福利精品视频在线| 中文字幕日韩高清| 97在线看福利| 91精品国产高清久久久久久| 亚洲黄色片网站| 国外视频精品毛片| 国产一区二区丝袜| 国产精品视频自拍| 久久久久久久久久久亚洲| 国产精品一久久香蕉国产线看观看| 久久免费视频观看| 成人国内精品久久久久一区| 亚洲精品97久久| 亚洲精品网站在线播放gif| 永久免费精品影视网站| 欧美激情三级免费| 欧美色另类天堂2015| 亚洲天堂视频在线观看| 亚洲自拍小视频免费观看| 中文字幕亚洲图片| 久久人人爽人人爽人人片亚洲| 狠狠躁天天躁日日躁欧美| 国产精品视频成人| 亚洲在线免费视频| 亚洲午夜女主播在线直播| 欧美国产中文字幕| 国产精品扒开腿做爽爽爽视频| 国产网站欧美日韩免费精品在线观看| 国产精品永久免费观看| 亚洲欧美国产视频| 日韩免费观看av| 97视频免费在线看| 日韩a**站在线观看| 欧美精品在线看| 日韩经典一区二区三区| 久久99热精品这里久久精品| 国产91色在线| 激情av一区二区| 亚洲午夜精品视频| 国产91色在线播放| 日韩国产精品视频| 亚洲女同性videos| 中文字幕日韩欧美精品在线观看| 国产日韩欧美91| 亚洲а∨天堂久久精品喷水| 情事1991在线| 国产精品99一区| 欧美伊久线香蕉线新在线| 久久综合国产精品台湾中文娱乐网| 国产98色在线| 日韩高清中文字幕| 国产精品欧美一区二区三区奶水| 91亚洲精品一区二区| 国产成人欧美在线观看| 久久97精品久久久久久久不卡| 成人激情在线观看| 国产区精品在线观看| 国产精品视频区| 成人信息集中地欧美| 最新国产成人av网站网址麻豆| 少妇av一区二区三区| 91地址最新发布| 精品一区二区三区四区在线| 91精品久久久久久久| 欧美在线观看www| 国产精品嫩草影院久久久| 国产中文日韩欧美| 亚洲乱码一区二区| 国产亚洲视频在线| 亚州成人av在线| 日韩欧美亚洲范冰冰与中字| 久久久久久久激情视频| 国产乱人伦真实精品视频| 97视频人免费观看| 日韩网站免费观看高清|