Hibernate作為資料持久層的分析和研究

來源:互聯網
上載者:User
資料    摘要 在Java技術中有許多方法可以對資料進行持久化,持久層也是Java應用程式中最重要的部分之一。本文在分析了3種持久層主流解決方案的基礎上,介紹了O-R映射開源項目Hibernate,並介紹了在Web應用開發中怎樣配置Hibernate的環境,並使用它建立一個應用。

   關鍵字 hibernate,資料持久化,JDBC, EJB,JDO

   資料持久層簡介

  J2EE的三層結構是指展示層(Presentation),商務邏輯層(Business Logic)以及基礎架構層(Infrastructure),這樣的劃分非常經典,但是在實際的項目開發法中,開發人員通常對三層結構進行擴充來滿足一些項目的具體要求,一個最常用的擴充就是將三層體系擴充為五層體系,即展示層(Presentation),控制/中介層(Controller/Mediator)、領域層(Domain),資料持久層(Data Persistence)和資料來源層(Data Source)。它其實是在三層架構中增加了兩個中介層。控制/中介層位於展示層和領域層之間,資料持久層位於領域層和基礎架構層之間。由於對象範例和關係範例這兩大領域之間存在“阻抗不匹配”,所以把資料持久層單獨作為J2EE體系的一個層提出來的原因就是能夠在對象-關聯式資料庫之間提供一個成功的企業級映射解決方案,盡最大可能彌補這兩種範例之間的差異。

   三種持久層主流解決方案

  1、JDBC

  許多開發人員用JDBC進行資料庫程式的開發。此中方式很多情況下都使用DAO模式,採用SQL進行查詢。雖然用此方式可以使應用程式代碼與具體的資料庫廠商和資料庫位置無關,不過JDBC是低層級的資料庫訪問方式,JDBC並不支援物件導向的資料庫表示。JDBC資料庫表示完全圍繞關聯式資料庫模型。在大型應用程式的DAO中書寫這樣的代碼,維護量是非常大的。

  2、EJB

  在J2EE的規範中,為EJB定義了兩種持久化的解決方案:一種是BMP,另一種是CMP。其中CMP不需要將SQL語句加入到代碼中。目前,在採用J2EE的應用中,EJB CMP方式得到了廣泛應用。更加引人注意的是,隨著EJB規範的發展,CMP也包含了一些進階關係的內容。但是,CMP的使用比較複雜,對很多開發人員來說比較難以掌握。而且,不是在所有的情況下都適合在系統中採用EJB,而且想要非常清楚的瞭解EJB規範也是非常費時的。在用EJB編碼前,先要讓專家理解API,然後需要瞭解每一個容器部署時所要關注的技術。此外,許多情況下商用容器的效能和支援也不是很好。

  3、JDO

  JDO是一個儲存java對象的規範,JDO規範1.0的提出可以使你將精力集中在設計Java物件模型,然後在公司專屬應用程式軟體架構的不同層面中儲存傳統的Java對象(Plain Old Java Objects,簡稱POJOs),採用JDOQL語言進行SQL操作。一些公司(包括sun)企圖根據JDO規範進行設計並實現JDO產品,然而他們都不能很好的進行實現,並且效能最佳化上比較差。

   資料持久層新的解決方案Hibernate

  1、Hibernate介紹

  Hibernate是一個開放原始碼的對象關係映射架構,它對JDBC進行了輕量級的對象封裝,使Java程式員可以隨心所欲的使用對象編程思維來操縱資料庫。它不僅提供了從Java類到資料表之間的映射,也提供了資料查詢和恢複機制。相對於使用JDBC和SQL來手工操作資料庫, Hibernate可以大大減少操作資料庫的工作量。 另外Hibernate可以利用代理模式來簡化載入類的過程,這將大大減少利用Hibernate QL從資料庫提取資料的代碼的編寫量,從而節約開發時間和開發成本Hibernate可以和多種Web伺服器或者應用伺服器良好整合,如今已經支援幾乎所有的流行的資料庫伺服器。

  2、Hibernate原理

  Hibernate技術本質上是一個提供資料庫服務的中介軟體。它的架構如圖1所示:


圖1


  圖1顯示了hibernate的工作原理,它是利用資料庫以及其他一些設定檔如hibernate.properties,XML Mapping等來為應用程式提供資料持久化服務的。

  Hibernate具有很大的靈活性,但同時它的體繫結構比較複雜,提供了好幾種不同的運行方式。在輕型體系中,應用程式提供JDBC串連,並且自行管理事務,這種方式使用了Hibernate的一個最小子集;在全面解決體系中,對於應用程式來說,所有底層的JDBC/JTA API都被抽象了,Hibernate會替你照管所有的細節。

   使用Hibernate建立一個應用

  1、配置Hibernate

  在src 目錄下建立名為hibernate.cfg.xml 的設定檔,並且將它的路徑添加到應用的類路徑中就可以完成Hibernate 的配置。該設定檔由Hibernate 用來串連到資料庫、產生模式和獲得其它特定資料庫資訊的屬性群組成。要將底層資料庫內的變動反射到整個應用,只需要修改該檔案內的屬性值。該設定檔的內容如下:

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

<hibernate-configuration>
<session-factory>
 <property name="hibernate.connection.driver_class">COM.ibm.db2.jdbc.app.DB2Driver</property>
 <property name="hibernate.connection.url">jdbc:db2:cipDB</property>
 <property name="hibernate.connection.username">admin</property>
 <property name="hibernate.connection.password">rubipass</property>
 <property name="dialect">cirrus.hibernate.sql.DB2Dialect</property>
 <mapping resource="com/ubipass/cip/data/Event.hbm.xml"/>
</session-factory>
</hibernate-configuration>
  2、建立映射文檔

  映射文檔是用來定義持久資料和在需要時儲存關於對象的持久域、關聯、子類和代理的XML文檔。對於每個持久對象和以名字class_name.hbm.xml儲存的檔案來說,都要建立一個映射文檔。在class_name.hbm.xml中class_name就是對象的類名,下面是Event.hbm.xml的內容。

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
 <class name="com.ubipass.cip.Event" table="EVENTS">
  <id name="id" column="uid" type="long">
   <generator class="increment"/>
  </id>
  <property name="date" column="event_date" type="timestamp"/>
  <property name="title" column="event_title" type="string"/>
 </class>
</hibernate-mapping>
  映射文檔在應用啟動時編譯,它可為Hibernate 提供關於持久對象的相應類、它們的結構、它們應該映射到哪個資料庫表格、以及如何映射的資訊。Hibernate 也使用這些映射文檔,分別利用內建裝置SchemaExport和CodeGenerator來產生相應的資料庫模式和stub Java類。

  3、產生用於持久對象的stub Java類

  在建立了映射文檔之後這個任務就變得簡單的多。stub類的建立使用Hibernate的內建裝置 CodeGenerator ,執行一個簡單的命令就可以完成。,命令的文法如下:

java -cp classpath net.sf.hibernate.tool.hbm2java.CodeGenerator

options mapping_files

  它為classpath、options、和mapping_files參數提供了恰當的值。下面是通過映射文檔Event.hbm.xml產生的stub java 類的部分代碼。
 
package com.ubipass.cip
public class Event {
 private String title;
 ……
 Event(){ }
 public Long getId() {
  return id;
 }
 private void setId(Long id) {
  this.id = id;
 }
 ……
}
  4、產生資料庫模式

  要使用Hibernate的 SchemaExport 來產生資料庫模式,在提交了用於參數的恰當值之後執行下列命令:

java -cp classpath net.sf.hibernate.tool.hbm2ddl.SchemaExport options mapping_files

  此命令為classpath、options、和mapping_files 參數提供了恰當的值。圖2顯示了由映射文檔產生的模式的外形。


圖2
  5、初始化並運行Hibernate的代碼

  要初始化和運行hibernate,需要採取以下步驟:

  ·在恰當的類中,初始化和組裝想要的持久對象 ;

  ·在應用啟動時使用net.sf.hibernate.cfg.Configuration 對象擷取net.sf.hibernate.SessionFactory 對象 ;

  ·調用SessionFactory 對象上的openSession() 方法來開啟net.sf.hibernate.Session ;

  ·儲存想要的對象,關閉Session。

  下面的代碼顯示了如何對上述的步驟進行實現:

// 初始化持久對象

Event ev = new Event();
ev.setDate("1/4/2004")
ev.setTitle("Hibernate startup");
try {
 //開始Hibernate
 Configuration cfg = new Configuration().addClass(Event.class);
 SessionFactory sf = cfg.buildSessionFactory();
 //開啟 Session
 Session sess = sf.openSession();
} catch (HibernateException e) {
 e.printStackTrace();
}

//儲存 Product 並關閉 Session

Transaction t = sess.beginTransaction();
sess.save(ev);
t.commit();
sess.close();
   總結

  Hibernate是一個功能強大,可以有效地進行資料庫資料到業務對象的O/R映射方案。Hibernate推動了基於普通Java物件模型,用於映射底層資料結構的持久對象的開發。通過將持久層的產生自動擴充到一個更大的範圍,Hibernate 使開發人員專心實現商務邏輯而不用分心於繁瑣的資料庫方面的邏輯,同時提供了更加合理的模組劃分的方法。

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。