摘要:Hibernate是一個可實現對象/關系映射的開源框架。分析了Hibernate的基本原理和特點,通過實例介紹了Hibernate框架應用開發的過程和方法。結果表明,利用Hibernate對象持久化服務,可以有效地進行數據庫數據到業務對象的O/R 映射,簡化數據庫操作,降低開發難度,提高開發效率。
關鍵詞:Hibernate;JAVA;對象持久化;對象/關系映射
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)29-0394-03
JAVA Object Persistence Technology Based on Hibernate
SU Hua-jun
(College of Computer Science and Technology,Anhui University of Science Technology, Huainan 232001,China)
Abstract: Hibernate is an open-source framework that carries out the object relational mapping. This paper gives an introduction to Hibernate’s principle and characteristic and than give a program sample to explain how to use Hibernate. The results indicate that the Hibernate object persistence services can effectively carry out database data to business objects O/R mapping, predigest database operations, reduce development difficulties and improve development efficiency.
Key words: Hibernate; JAVA; object persistence; O/R mapping
1 引言
創建和維護數據持久層是J2EE開發的重要部分之一,它的設計成功與否往往對項目開發有著至關重要的影響。以前,大多數項目都是采用JDBC 方式在代碼中直接訪問數據庫,這種訪問方式不僅在開發時代碼冗長,而且在后期也不易移植和擴展。于是,各種團體都試圖尋找出一種解決方案,以便能讓開發人員從復雜、繁瑣的持久層編碼工作中解脫出來。Hibernate 正是在這種需求下誕生的,它為Java 應用提供了一個易用、高效的對象/關系映射框架,極大的簡化了持久層開發。
2 Hibernate持久化技術
2.1 Hibernate簡介
Hibernate是一種Java語言下的對象/關系映射解決方案。它是使用GNU寬通用公共許可證發行的自由、開源的軟件[1]。它為面向對象的領域模型到傳統的關系型數據庫的映射,提供了一個使用方便的框架。它的設計目標是將軟件開發人員從大量相同的數據持久層相關編程工作中解放出來。
Hibernate不僅負責從Java類到數據庫表的映射(包括從Java數據類型到SQL數據類型的映射),還提供了面向對象的數據查詢檢索機制,從而極大地縮短了手動處理SQL和JDBC上的開發時間。另外,Hibernate 可以利用代理模式
來簡化載入類的過程,這將大大減少利用HQL(Hibernate Query Language)從數據庫提取數據的代碼編寫量,從而節約開發時間和開發成本[2]。通過使用Hibernate開發者可以輕松解決在使用傳統的CMP以及JDBC和DAO(Data Access Object)技術開發持久層時遇到的困難,使生產力得到極大的提升。
2.2 Hibernate原理
Hibernate技術本質上是一個提供數據庫服務的中間件。圖1顯示了Hibernate的工作原理。Hibernate在構建Java應用中的作用是:應用程序通過Hibernate對數據庫進行訪問,對持久層操作,而Hibernate自身通過properties配置文件和XML Mapping映射文件將類型映射到數據庫的記錄[5]。從而Application應用可以通過起著應用與數據庫之間的橋梁作用的持久化對象直接訪問數據庫,而不是必須使用JDBC和SQL進行數據的操作。
Hibernate具有很大的靈活性,提供了好幾種不同的運行方式。在輕型體系中,應用程序提供JDBC連接,并且自行管理事務,這種方式使用了Hibernate的一個最小子集;在全面解決體系中,對于應用程序來說,所有底層的JDBC/JTAAPI都被抽象了,Hibernate會照管所有的細節[3]。
2.3 選擇Hibernate的原因及其應用優勢
Hibernate是Java開源項目,其底層代碼對用戶開放,這樣用戶可以在需要的時候修改其源代碼,對其進行功能的定制或者拓展,并且擁有豐富的參考文檔與實例。Hibernate具有一支活躍的社區開發隊伍,這使其長期發展有了穩定的保證。Hibernate使用方便,既適用于桌面程序開發,也可以引入到企業級應用開發中[4]。
由于Hibernate對JDBC進行了輕量級的對象封裝,如果有需要,用戶可以繞過Hibernate,直接訪問JDBC API。Hibernate的Transaction實際上就是底層的JDBC Transaction的封裝,這樣大大簡化了數據持久層的開發與調試,減輕了程序員的負擔[4]。
3 利用Hibernate實現JAVA對象持久化的方法與過程
Hibernate是Java應用程序和關系數據庫之間的橋梁,它負責Java對象和關系數據庫之間的映射。Hibernate內部封裝了通過JDBC訪問數據庫的操作,向上層應用提供了面向對象的數據訪問API。
在應用Hibernate框架時,首先需要編寫它的配置文件;再根據此文件生成映射描述文件,完成Java對象與關系數據庫數據之間的映射,同時生產持久化對象;最后編寫業務邏輯類,以實現具體的業務邏輯,并封裝對Hibernate的訪問。
下面以一個實例來介紹一下Hibernate框架在對象持久化中的應用。
該實例在Hibernate3.0、JDK6.0和MS-SQL2005中運行通過。
1) 在數據庫里面建立一個數據表,表名為userinformation,表的結構如圖2所示:
2) 創建Hibernate配置文件
Hibernate的配置文件有兩種形式:一種是基于XML的,文件名一般為hibernate.cfg.xml;還有一種是JAVA屬性文件。配置文件應該位于應用的classpath中,以便順利讀取。在配置文件中,主要涉及了XML文檔的類型定義,數據庫連結的各種參數以及供Hibernate管理事務,產生SQL和管理JDBC連結時所涉及的數據映射文件等。
下面介紹基于XML的配置文件:
<hibernate-configuration>
<session-factory>
<property name=\"connection.username\">sa</property>//數據庫的登陸用戶名
<property name=\"connection.url\">//數據庫地址
jdbc:sqlserver://localhost:1433;databaseName=MyNetInformation
</property>
//對于每種數據庫Hibernate都有一個方言類,用來區別不同數據庫之間的語法差異
<property name=\"dialect\">org.hibernate.dialect.SQLServerDialect
</property>
<property name=\"connection.profile\">sql2005</property>
<property name=\"connection.password\">534314</property>//數據庫登陸密碼
<property name=\"connection.driver_class\">//數據庫驅動類
com.microsoft.sqlserver.jdbc.SQLServerDriver
</property>
<mapping resource=\"cn/edu/aust/Userinformation.hbm.xml\" /></session-factory>
</hibernate-configuration>
如果要改用別的數據庫,則只需要修改配置文件里面的dialect類,數據庫驅動類,數據庫連結地址,而無需修改程序代碼,這樣就大大的節省了開發成本,同時也增強了程序的可移植性。目前,Hibernate已經對市場上絕大部分的數據庫提供了支持。
3) 創建持久化類(即持久化對象Userinformation.java)
Hibernate要持久化的對象可以使用標準的Javabean,而這個對象的屬性和數據庫中相對應的數據表的列是一一對應的。這里的對應不但指的是對象的屬性和表的列的個數要相同,更重要的是,每個屬性的數據類型要和表中每個列的數據類型要能一一對應。對于類的每個屬性都要有public的getter方法和setter方法,在命名上應嚴格遵守bean的命名規則。
public class Userinformation {
private String username;
private String usernicname;
private String useremail;
public String setUsername(String name) {
this.username = name;
}
public String getUsername() {
return username;
}
......
}
4) 創建對象-關系映射文件(Userinformation.hbm.xml)
Hibernate通過XML格式的文件來指定需持久化的對象和關系數據庫的表之間的映射。
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<!DOCTYPE hibernate-mapping PUBLIC \"-//Hibernate/Hibernate Mapping DTD 3.0//EN\"
\"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd\">
<hibernate-mapping>
<class name=\"cn.edu.aust.Userinformation\" table=\"userinformation\" schema=\"dbo\" catalog=\"MyNetInformation\">//類名和對應的數據庫表名稱
<composite-id name=\"id\" class=\"cn.edu.aust.UserinformationId\">//
<key-property name=\"username\" type=\"java.lang.String\">
<column name=\"username\" length=\"20\" />//屬性和列一一對應
</key-property>
<key-property name=\"usernicname\" type=\"java.lang.String\">
<column name=\"usernicname\" length=\"20\" />
</key-property>
<key-property name=\"useremail\" type=\"java.lang.String\">
<column name=\"useremail\" length=\"30\" />
</key-property>
</composite-id>
</class>
</hibernate-mapping>
Hibernate還為我們提供了四個轉換工具hbm2java(根據映射文件自動生成JAVA源文件),hbm2ddl(根據映射文件自動生成數據庫Schema),XDoclet(根據帶有XDoclet標記的JAVA源文件生成映射文件),Middlegen(根據數據庫Schema自動生成映射文件)。利用這幾個工具,可以大大減少我們的工作量,提高工作效率,同時也可以減少出錯的可能性。
5) 通過Hibernate API訪問數據庫
要進行數據操作,首先要連接數據庫,根據Hibernate 的配置文件hibernate.cfg.xml,執行以下代碼即可完成數據庫的連接,同時提供Hibernate的對外接口:
Configuration cfg = new Configuration().configure(“hibernate.cfg.xml);
SessionFactory sessionFactory = cfg.buildSessionFactory();
得到了全局的SessionFactory,就可以從中獲取sesssion。Session是介于數據連接與事務管理的中間接口,它的作用相當于一個持久對象的緩沖區,Hibernate 可以通過Session 檢測到持久化對象的改變,并及時刷新數據庫。 當獲得session後,就可以進行對象的操作,如查詢,修改,插入,刪除等。利用Hibernate添加一條記錄的語句如下:
Userinformation user = new Userinformation();
Session s = sessionFactory.openSession();
Transactiont t = s.beginTransaction();
s.save(user);
......
從實例可以看出,簡單幾行代碼即可實現對象的持久化操作,將其保持到數據庫中,而與數據庫的連結完全由Hibernate來代勞,在代碼里看不到任何和數據庫有關的代碼。由此可見,采用Hibernate框架在很大程度上簡化了數據庫訪問代碼的編寫量,極大的提高了開發效率。此外,我們還可以使用Hibernate自身提供的查詢語言HQL來進行數據庫查詢。HQL和普通的SQL語句相似,它只是將SQL里的表名和列名用對象名和成員名代替。另外,一般的JDBC查詢返回的是ResultSet對象,而利用HQL查詢返回的是包含了查詢結果對象的List對象,從而不必像傳統JDBC 訪問方式一樣把結果集的數據逐個裝載到一個值對象中。
在Hibernate中,還有許多的高級特性,比如實體對象的識別,Hibernate回調與攔截機制等。
4 結論
Hibernate是一個輕量級的數據持久化對象/關系映射框架。利用其提供的對象持久化服務,可以有效地進行數據庫數據到業務對象的O/R映射,簡化數據庫操作,降低開發難度,提高開發效率,進而使得Java企業級應用開發更加容易、靈活、強大。
參考文獻:
[1] 夏昕,曹曉鋼,唐勇.深入淺出HIBERNATE[M].北京:電子工業出版社,2005.
[2] 孫衛琴.精通HIBERNATE:Java 對象持久化技術詳解[M].北京:電子工業出版社,2005.
[3] 蔡雪燾.Hibernate開發及整合應用大全[M].北京:清華大學出版社.2006.
[4] CHRISTIAN BAUER,GOVIN KING.Hibernate實戰[M].英文版,2版.北京:人民郵電出版社,2007.
[5] http://hibernate.org[EB/OL].