使用Hibernate 的O/R 映射(轉)

目錄
1.持久層:問題和解決方案
2.安裝Hibernate
3.配置Hibernate
4.使用Hibernate建立一個應用
5.結論

大部分企業應用不得不與他們的後端數據庫頻繁交互。爲了讓這種交互成爲可能,並且使得交互變得有效而迅捷,企業應用開發者在應用和底下的數據庫之間創建了一個“持久層”(persistence layer)。這個數據庫負責存儲從應用到數據庫的數據,也負責數據的檢索、更新和刪除。在基於J2EE的企業應用中,組成這個持久層的Java類既可以映射對象到數據,也可以映射數據到對象。這個持久層使用JDBC、實體beans 、JDO等等之類的工具通常都可以建立。

1.持久層:問題和解決方案

建立一個持久層是簡單的,只要在Java對象和相應的數據庫之間存在線性關係(例如:一個對象域映射到相應的數據庫表格的某一列)。但是這種關係常常難於建立,因爲對象或者下層的數據庫結構複雜(例如,對象具有混合的類型、集合、和屬性;數據庫表格有外部鑰匙約束、串聯屬性)

經常,在開發持久層的時候,後端數據庫的屬性和它的模式假設永遠保持不變。基於這種假設,所有的持久性操作在應用中是硬編碼的,因此只能綁定到一種特殊的數據庫模式中。當後端的數據庫模式任何時候發生改變(這在現實生活中經常發生),這種方法極耗時間和精力。數據庫模式的改變導致了整個持久層必須重寫,應用程序代碼本身也有可能要進行大量的修改。這是一個單調乏味、非常費時的任務。

而且,這些持久層常有可能發生故障,效率低下。

這就是Hibernate 最拿手的地方。Hibernate 是一個開源對象/與持久性和查詢相關的框架。目前在版本2.1.1中, Hibernate 是一個ODMG3 interface ,只要有Lesser GNU Public License (LGPL)就可以從hibernate.org 處免費下載。

ODMG3 是由對象數據管理小組(ODMG)開發的規範,ODMG 是一個由不同的投資商和興趣小組爲開發用於對象數據庫和對象相關的映射產品的可移植性規範而結成的聯盟。該規範推動了在不止一個產品上運行的可移植應用程序的開發。要了解更多信息請看鏈接.

Hibernate 幫助基於普通的Java對象模型的持久對象的創建,從而允許持久對象擁有複雜的結構如混合類型、集合和屬性,還可以擁有用戶自定義的類型。現在這些持久對象可以有效的反映出底層數據庫模式的複雜結構。Hibernate 依賴於“運行期反射”。

“運行期反射”在運行期收集關於對象和它們相應的數據庫映射的信息,這就廢除了持久層內對象數據庫映射的硬編碼。這樣,Hibernate使得持久層以持久層代碼的最小修改就能夠適應底層數據庫模式的任何未知變化。反射是核心Java的一個特徵,它促使Java代碼發現關於所裝載的類的域、方法和構造器。反射允許使用反射的域、方法和構造器,在安全限制內,運行對象上的底層配對物。要了解更多信息請看鏈接。

Hibernate 自動將持久層擴展到更大的範圍,使用它內建的設備CodeGenerator SchemaExport 就可以完成,從而大大的降低了硬編碼的故障率。Hibernate 也提供了易於使用的Hibernate Query Language (HQL),它是作爲“到SQL的最小化面向對象擴展”而設計的一種豐富的查詢語言。HQL 推動了數據庫類型獨立查詢的編寫,數據庫類型獨立查詢在運行期內可以轉換成底層數據庫的本地SQL方言。該方法保證了底層數據庫類型改變時(如從Oracle 變爲PostgreSQL )代碼中的查詢不受影響。

爲了提高效率,Hibernate包括了一些策略,如與數據庫交互時的多重最優化,包括對象的緩存、有效外部連接的獲取、必要時SQL語句的執行。Hibernate的過程開銷比JDBC少10%。

2.安裝Hibernate

· 從SourceForge處下載Hibernate源代碼的最新版本(如文件hibernate-2.1.1.zip或者hibernate-2.1.1.tar.gz)。 而且,請看hibernate.org 上的Download Overview 以備參考。

· 解壓源代碼文件,將內容釋放到想要的目錄下(最好是application development directory)。現在,給定的目錄將包含Hibernate自己的JAR 庫hibernate2.jar,以及包括兩個重要目錄libsrc 的其他目錄。lib 目錄包含用於代碼生成、ODMG、dom4j、日誌等等的第三組織的庫。src 目錄包含持久層的源文件。

· 添加hibernate2.jar 和其他JAR 庫的相應路徑到lib 目錄下,對於應用程序的開發來說,到達應用的類路徑是有必要的。

· 定位用於將要使用的數據庫(如用於DB2 UDB的db2java.zip)的JDBC 驅動,添加他的路徑到全局類路徑。

現在,Hibernate已經爲開發給定應用的持久層做好準備。下面部分探索了完成該任務的必要步驟。

3.配置Hibernate

在src 目錄下創建名爲hibernate.properties 的屬性文件,並且將它的路徑添加到應用的類路徑中就可以完成Hibernate 的配置。該屬性文件由Hibernate 用來連接到數據庫、生成模式和獲得其它特定數據庫信息的屬性組成。要將底層數據庫內的變動反射到整個應用,只需要修改該文件內的屬性值。Listing 1 給出了一個簡單的例子,這些屬性中的大部分屬性都是可以自我說明的。

注意: 現在Hibernate也可以使用存在於src 目錄下,名爲hibernate.cfg.xml 的簡單XML文件來配置。該文件的結構與hibernate.properties 非常類似,並且具有相同的功能。Listing 2給出了一個例子。

4.使用Hibernate建立一個應用

現在,我們開始建立應用。其步驟如下:

· 創建映射文檔

· 生成用於持久對象的stubJava類

· 生成數據庫模式

· 準備用來初始化和在恰當位置上運行Hibernate 的代碼

下面將爲你一一詳解這些步驟。

創建映射文檔

映射文檔是用來定義持久數據和需要時保存關於對象的持久域、關聯、子類和代理的XML文檔。對於每個持久對象和以名字class_name.hbm.xml保存的文件來說,都要創建一個映射文檔。在class_name.hbm.xmlclass_name就是對象的類名。Listing 3給出了一個映射文檔Event.hbm.xml。

映射文檔在應用啓動時編譯,它可爲Hibernate 提供關於持久對象的相應類、它們的結構、它們應該映射到哪個數據庫表格、以及如何映射的信息。Hibernate 也使用這些映射文檔,分別利用內建設備SchemaExportCodeGenerator來生成相應的數據庫模式和stubJava類。

生成stub類

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

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

它爲classpath、options、mapping_files參數提供了恰當的值。Listing 4顯示了使用Listing 3中給出的映射文檔生成的stub文件。

生成數據庫模式

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

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

他爲classpath、options、mapping_files 參數提供了恰當的值。下圖顯示了使用Listing 3中給出的映射文檔而生成的模式。

273674.gif

Figure 1: 使用Listing 3中給出的映射文檔而生成的模式的外形

初始化和運行Hibernate

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

· 在恰當的類中,例示和組裝想要的持久對象

· 在應用啓動時使用net.sf.hibernate.cfg.Configuration 對象獲取net.sf.hibernate.SessionFactory 對象

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

· 保存想要的對象,關閉Session.

Listing 5顯示瞭如何使用一個簡單的類來實現上述步驟。現在,應用已經是完整的,在執行時,可以保存想要的對象到底層數據庫中,目的是爲了讓他們具有持久性。

5.結論

Hibernate是一個功能強大、高性能、特徵豐富,非常流行的用於 Java 的ORM 方案。Hibernate推動了基於普通Java對象模型,用於映射底層數據結構的持久對象的開發。 除了映射對想到數據庫之外,Hibernate也可以提供高級數據查詢和檢索服務,通過HQL、有效緩存、和其它優化技巧以及用於代碼和模式生成的有用的內建設備可以完成這些任務。

通過將持久層的生成自動擴展到一個更大的範圍,Hibernate 可幫助減輕開發者可達95%的普通的與持久性相關的編碼工作。

關於作者

Mugdha Chauhan (正式名Mugdha Vairagade) 是一名資深的IT顧問和作家。作爲一個開源支持者,她頻繁寫作關於有用的新興開源項目的文章和指南。主要的技術媒體包括developer.com、 IBM developerWorks、 CNET Networks、 Slashdot在內,以及許多的電子雜誌都定期的發表它的作品。他擅長和感興趣的方面包括: Java、 Linux、 XML、 無線應用開發和開源

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章