摘要:當今大部分的應用系統需要處理持久化數據,而在使用面向對象技術開發系統時,會遇到對象持久化的問題。同時使用關系數據庫存儲數據,存在對象模型與關系模型之間的“阻抗不匹配”問題。對廣泛使用的0/R映射框架Hibernate進行研究,使用Hibernate作為業務邏輯層和數據庫層之間的持久層,實現對象到關系數據庫的持久存儲。結合實際應用系統分析對象/關系映射在Hibernate持久化解決方案中的體現。
關鍵詞:對象持久化;持久層;對象/關系映射;Hibernate
中圖分類號:TP311
文獻標識碼:A
文章編號:1004-373X(2008)04-066-03
現今,面向對象開發技術已經普及到各種軟件開發領域中,他是用符合事物本原與適應人類自身思維方式的方法組織程序。面向對象技術是一種基于類和對象的應用程序開發技術,程序員通過使用類和對象,以及對他們繼承、封裝等操作,可以方便地開發出高質量的應用程序。同時當前大多的應用程序都使用關系數據庫作為數據的存儲機制。而面向對象的機制與關系模型有著很大的不同,他們之間存在阻抗不匹配(Impedance Mismatch)。面向對象設計基于軟件工程的一些原理如聚集、封裝等理論,其使用一組對象來完成任務;而關系模型基于數學原理,尤其是集合論的原理。因此,需要一種映射方法解決這種不匹配,對象關系映射便隨之產生。把對表直接進行的操作,變成對對象的屬性和方法的操作。Hibernate是一個基于Java的開放源代碼的對象關系映射框架,他對JDBC做了輕量級的封裝。目前Hibernate已被廣泛使用,作為企業應用和關系數據庫之間的中間件,以減輕和對象持久化有關的大量的JDBC編程工作。
1 對象持久化
1.1對象持久化的定義
在使用面向對象技術開發應用系統時,系統運行過程中構造的對象實例,都是瞬時或暫時性的,叫作暫態對象或臨時對象;他存在于內存之中,系統一旦停止運行,這些對象都將消失,信息不復存在。因此,需要將對象實例長期持久地保存,使之成為永久對象,這就是對象持久化。
1.2 實現對象持久化的方法
對象持久化技術是可以永久地存儲對象的方法,持久化機制包括基于操作系統的文件存儲、關系數據庫RDB和面向對象的數據庫OODB等。目前大多使用關系數據庫作為對象持久化的存儲機制,采用關系數據庫實現對象持久化的方法主要有:內嵌SQL語句、封裝成數據類以及使用對象持久層。
(1)內嵌SQL語句:這種方法最為常見,他是在類的源代碼中嵌入SQL語句。其優點是編碼快捷,適用于小型應用程序和原型模型中;缺點是難于維護和擴展,數據庫的小變化(如:列的重新命名)也會導致源代碼的改寫。模式圖如圖1所示。

(2)封裝成數據類:這種方法是將業務類里的SQL語句封裝到一個或幾個“數據類”里,例如存儲過程和EJB的實體Bean策略。這種方法適用于40~50個類的小型系統。但是當數據庫發生簡單變化時,仍會導致數據類的重新編譯。模式圖如圖2所示:

(3)對象持久層:持久層是應用程序與數據庫的隔離層,他封裝了與數據庫交互的底層細節。使用持久層時數據庫的簡單改變不會影響面向對象的代碼。程序員只需管理和使用面向對象的數據,而不必關心數據存儲的底層實現細節。模式圖如圖3所示。
2 對象/關系映射
面向對象的機制與關系模型之間存在著阻抗不匹配,兩者有著不同的理論基礎。對象模型側重于使用包含數據和行為的對象來構建應用程序;而關系模型則主要針對于數據的存儲。兩種機制的不同使他們的結合并不理想。因此,需要一種映射方法來解決兩者之間的不匹配。這種方法就是對象關系映射0bject/Relational Mapping(O/RMapping)。
2.1對象/關系映射模式
在研究對象/關系映射的模式時,通常采用如下的對應關系將對象與數據表關聯起來:

根據抽象對象與關系數據庫的特性,O/R Mapping在以下幾個方面實現:
(1)從類屬性到數據表列的映射。類屬性和表列并非一一對應。一個類屬性可對應O或多個實體表的字段。在設置主鍵時,通常采用無業務意義的字段對象標識符(Object Identifier,OID)作為各個實體表的主鍵,OlD也作為類與數據庫映射時的對象的惟一標識。
(2)從類到數據表的映射。當不同層次的父類和子類映射到數據表時,應該根據實際的系統設計結果,權篌采用怎樣的映射策略。這種映射主要是指繼承映射,可以采用的映射策略主要分為以下3種:1個類繼承樹1個表、1個具體類1個表和1類1表。
(3)類間關系映射為鍵值。這是映射的難點,主要是體現類關系中的關聯和聚集。關聯關系的映射中,一對一關聯、一對多關聯是通過在關聯的某一方引用對方的OIE實現;多對多的關聯需要創建關聯表,或者劃分成一對多和多對一。聚集關系的映射有2種模式,分別是單表聚集模式和外鍵聚集模式。
2.2 對象/關系映射框架
如今常用的持久層框架有:EJB,JDO,Hibernate。Cas—tor和TopLink等。其中Hibernate是一個開放源代碼的ORM框架,他給開發者提供了一個強大而易用的O/R映射機制,得到了廣泛的應用。
3 Hibernate
Hibernate是Gavin King于2001年開始開發的。他是一個基于Java的對象關系映射框架,對JDBC做了輕量級的封裝,以統一的接口方式支持多種數據庫,具有豐富、詳細的參考文檔。現在,越來越多的開發人員把Hiber-nate作為企業應用和關系數據庫之間的中間件。
3.1 Hibernate配置
使用Hibernate進行對象的持久化,需要一個配置文件對Hibernate進行配置和初始化。Hibernate有2種配置方式,分別是使用hibernate.properties文件和hiber-nate.cfg.xml文件,2種配置是一樣的。在配置文件中,可以配置數據庫的方言、連接驅動類、用戶名及密碼和URL等。此外,使用hibernate.cfg.xml文件進行配置時還可以指定mapping resource,在這里寫入持久化類的映射文件(類名.hbm.xml)。
3.2持久化類
Hibernate創建和使用的持久化對象大多是一種叫作POJO(Plain Ordinary Java Objeet)的對象,從字面上來講就是無格式普通Java對象,可以簡單地理解為一個不包含邏輯代碼的值對象(Value Objeet,VO)。
持久化類必須單獨定義一個主鍵ID,作為對象標識符OlD。另外,每個屬性都要有與之對應的getter和set—ter方法。
3.3 映射文件
每個持久化類都要有與之對應的映射文件,映射文件名為“類名.hbm.xml”。這個映射文件定義O/R映射的規則。例如持久化類Person具有屬性ID和name,其映射文件Person.hbm.xml可以描述如下:


其中主鍵應該用<id>描述,在該節點下用<genera—tor>節點聲明主鍵的生成策略,在使用中需根據實際需要選擇使用何種策略。
映射的內容除了主鍵ID、一般屬性外,還包括繼承的映射、關聯的映射和組件的映射等。本文所涉及的賓館管理系統使用了其中的一些映射模式,其說明如下:
(1)繼承的映射:對于有繼承關系的父類和子類的映射,只需建立父類的映射文件,然后在這個文件中描述子類的映射。繼承映射有3種映射策略,在Hibernate映射規則中都有相應實現,如可以使用“一個類繼承樹一個表”的映射策略l映射文件中使用

3.4持久化對象的操作
首先,映射文件要將持久化類映射到相應的數據庫表,這里需要用Configuration類配置,并建立起映射關系,然后在這個配置基礎上建立一個會話工廠SessionFacto-

創建會話工廠后,就可以從中獲取會話Session,每次Session操作,代表應用程序和持久層之間的一次對話,也就是1次數據處理。獲取Session后,可以對對象進行保存、查詢、刪除和修改等操作。使用Hibernate提供的面向對象的查詢語言HQL(Hibernate Query Language),使得對對象的操作變得十分簡單:

4 結 語
應用對象持久層的開發方法是一種完全面向對象的方法,在該方法中,首先從問題域中抽象出類與對象;其次對于持久性對象,通過對象持久層實現其與存儲機制的交互。持久層框架已廣泛應用于當前的系統開發中,使用成熟的持久層框架,能夠大大提高系統開發的效率。Hibernate作為成功的持久層框架被廣泛使用,在應用系統開發中正在并繼續發揮重要的作用。