張少應,程傳旭
(西安航空學院 計算機工程系,陜西 西安 710077)
基于Hibernate的對象關系映射研究
張少應,程傳旭
(西安航空學院 計算機工程系,陜西 西安 710077)
對象關系映射解決了面向對象程序設計語言與關系數據庫存在的互不匹配問題?;趯ο箨P系映射的持久化框架實現了業務邏輯與數據訪問的分離,簡化了數據庫訪問,降低了應用開發難度。本文分析了基于Hibernate框架的兩種對象關系映射策略,并比較了三種繼承映射策略的優缺點,設計了一種基于Hibernate的ORM持久化層的系統架構,該架構結構清晰、開發效率高,具有較高的應用價值。
對象關系映射持久化層繼承關系關聯關系
在日常開發中,關系數據庫表與表之間都存在關聯關系,通常使用主鍵和外鍵來實現,以此減少數據庫中數據的冗余、提高數據訪問效率、保證數據庫實體的完整性和一致性。Hibernate框架是一個開源的對象關系映射框架,是輕量級JavaEE應用的持久層解決方案,不僅管理Java類到關系數據庫表之間的映射,還提供了數據查詢、數據緩存等功能,大幅縮短了使用JDBC處理數據持久化的時間。對象關系映射(Object/Relation Mapping,ORM)是為解決面向對象與關系數據庫存在互不匹配問題的技術,通過ORM映射,使得開發人員能更好使用面向對象程序設計語言的易用性,以及關系數據庫的優勢,提高應用程序的開發效率,實現關系數據庫存放數據的完整和一致。
基于Hibernate框架的對象關系映射的主要任務是實現數據庫關系表與持久化類之間的映射,簡化了持久化層數據的訪問。開發人員使用面向對象程序設計的方法,以對象為基礎,通過操作對象,完成關系數據庫的訪問。本文分析了基于Hibernate框架的兩種對象關系映射策略,比較了3種繼承映射策略的優缺點;結合軟件分層設計理念,設計了一種基于Hibernate的ORM持久層的系統架構,該持久層專注于數據庫交互進行數據的持久化工作,提供一個標準的接口供業務邏輯層調用。該架構具有結構清晰、開發效率高等優點,具有較強現實應用價值。
對象關系映射大致可以分為繼承關系映射和關聯關系映射[1]。在關系數據庫中,通過主外鍵將數據庫表關聯起來,而Hibernate框架[2-3]的關聯關系映射將簡化了持久化層數據訪問的優勢,在實現機制上要比關系數據庫復雜的多。根據關聯的方向和數量的不同,關聯關系的映射也不同。按照關聯的方向可分為單向關聯和雙向關聯;依據關聯數量的不同,關聯關系可分為一對一(1-1)、一對多(1-N)、多對一(N-1)以及多對多(N-N)。
1.1關聯關系映射
在基于Hibernate框架的關聯映射實現過程中(如圖1),基于XML的ORM映射文件充當了關系數據庫與POJO (Plain Old Java Object,POJO)類文件之間的橋梁角色,使用這種具有開放標準、便捷數據處理特點的文件,實現了關系數據庫與POJO類文件之間的關聯,以此簡化了持久化層數據訪問。在ORM映射文件中,不僅完成了關系數據庫表與POJO類之間的基本映射信息(表名與類名、id、字段與類屬性之間的映射),而且使用特定的元素 (<many-to-one>、<oneto-one>、<many-to-many>等)實現了基于主鍵、基于唯一外鍵的1-1、N-N關聯關系,或者基于連接表的1-N、N-1關聯關系。所有ORM映射文件在Hibernate的配置文件hibernate. cfg.xml注冊后,才能被Hibernate框架加載,結合持久化類完成了Hibernate框架的映射機制。
持久化類是持久化層數據訪問中至關重要的角色,用來映射關系數據庫中的表,Hibernate框架才能以對象的視角操作數據庫。Hibernate框架采用低侵入式設計,不要求持久化類繼承任何父類或接口,直接采用POJO作為PO(Persistant Object,PO)[4]。而POJO文件不僅為持久化的每個屬性提供了getter和setter方法,在持久化類中也提供一個同數據庫表的主鍵對應的標識屬性;同時也提供了無參構造方法,為Hibernate框架創建持久化類的實例提供了便利。在POJO文件中,通過在某一個實體類文件中聲明與另一個實體類對象的屬性,或者創建與當前對象關聯的集合實例,實現了實體對象之間的關聯關系。

圖1 基于主鍵的1-1關聯映射策略
1.2繼承關系映射
繼承關系是面向對象程序設計的主要特征,是關系型數據與面向對象數據結構之間的主要差異之一。在關系數據庫中無法直接實現對象間的繼承關系,文獻[6]中提出了基于關系數據庫的管理信息系統中繼承關系實現機制,同框架結構的實現方法相比,該方法實現機制比較復雜。Hibernate框架實現繼承關系映射通常使用以下3種策略。
1)當主表與父類對應,從表分別對應子類時,采用TPS (Table Per SubClass,TPS)映射策略。使用TPS實現繼承關系映射的基本方法是父類和每個子類都對應一張表 (如圖2),子類和父類之間使用數據庫表的主鍵來設置它們的關聯關系;父類實例存放在父類表,而子類實例則由父類表和子類表共同存儲?;谠摲N設計,主表和從表的映射信息都存放在與父類同名的配置文件中,通過<joined-subclass>元素實現子類及對應從表之間的映射信息,指定子類的名字、子類對應的表名、子類的主鍵以及屬性,完成子類映射關系的配置。使用TPS策略,開發人員能夠完全使用面向對象思想,實現對PO文件的使用;從表中除主、外鍵的其他字段,可以采用非空約束。但該策略在查詢子類實例數據時,需要跨表查詢,降低了數據處理的性能。

圖2 基于TPS的繼承關系映射策略
2)整個繼承關系中的實例都存放在同一個表中,使用標識字段區分不同的對象實例,采用TPH (Table Per Class Hierarchy,TPH)映射策略。基于這種設計,子類和父類的映射信息都可以存放在父類對應的映射文件中,使用<subclass>元素配置每個子類擴展的獨有屬性,指定子類的名字、子類的具體區分值以及屬性;使用discriminator元素映射標識字段,將表的區分字段配置成區分值。使用該方法最大的優點就是簡單、執行效率高,所有數據存放在一張表中,無論進行何種查詢,底層數據庫只需在一張表中查詢,無需進行多表連接查詢或者union查詢;數據的存取通過操作各自的類實例完成。缺點在于存在冗余字段,每次在類層次的任何地方添加一個新屬性時都必須將該屬性添加到這張表中,所有子類定義的字段,都不能有非空的限制,如果有太多的非空限制時,將使得父類的實例在這些列沒有值存在,產生了數據完整性沖突,導致父類無法存放在數據庫中。
3)實體類層次上采用繼承關系,每個具體類使用一個數據實體,在該實體中不僅包含屬性也包含繼承的父類成員屬性,采用TPC(Table Per Concrete Class,TPC)映射策略?;谶@種設計,父類實例的數據保存在主表中,子類實例的數據保存在子表中,每個子類對應一個具體的表,子類表之間沒有關聯關系。在該映射策略中,由于子類表中的字段等于父類屬性加子類屬性之和,因此子類表中的字段比父類表中的字段多。在父類對應的映射文件中,使用<union-subclass>元素指定子類的名字、子類對應的表名以及屬性,完成子類擴展屬性的配置。TPC映射策略的優點在于數據結構清晰,子類的成員屬性映射的字段可以不受非空約束。該策略缺點在于子表的主鍵屬性不允許重復;由于同一繼承層次中所有實體類必須使用同一主鍵種子,因此不能使用數據庫的自增方式生成主鍵;父類的屬性出現在多張表中,出現數據冗余。
軟件分層設計具有擴展性強、維護方便、組件重用性高等優點,有利于軟件開發的標準化,也便于對整個開發過程的管理,因此被越來越多的開發者使用。基于Hibernate的ORM持久層[7]就是在三層架構的基礎上,將持久化層從業務邏輯層中分離出來,使其位于數據庫層與業務邏輯層之間,形成了目前比較流行的基于JavaEE的多層軟件架構 (如圖3)。使用多層軟件架構,層次分明,分工明確且相對獨立,實現了功能層中業務邏輯和數據邏輯之間的松耦合關系[5],同時也降低了開發成本和開發風險,提高了數據的安全性能。目前基于Struts2.x、Spring和Hibernate框架集成的開發方式,采用面向接口編程的思想,具有良好的分層結構設計,以及開發效率高、通用性好等優點,是企業級基于JavaEE應用開發的首選。而基于Hibernate的對象關系映射技術,本身就是用于簡化持久化層數據的訪問,該技術在分層設計中的使用,縮短了開發周期,降低了開發難度。
在持久層實現中,DAO層完成連接數據庫的增加、刪除、修改等實現細節。而Hibernate框架通過ORM映射文件完成關系數據庫與POJO類文件之間的關聯,結合DAO層實現了底層數據訪問操作與業務邏輯的分離,對業務邏輯提供了各類面向對象的數據訪問接口,業務邏輯層通過調用DAO接口實現了整個業務方法。

圖3 基于SSH2管理信息系統架構
對象關系映射使得關系數據庫與對象之間的轉換更加透明,開發人員無需關心數據庫連接、并發和事務等特性;也改變了以往使用SQL語句進行查詢的麻煩,使開發人員完全使用面向對象的思想編程,完全使用面向對象的角度進行關聯查詢操作。Hibernate框架是目前比較成熟的ORM框架,是對JDBC輕量級封裝,實現了用面向對象的方式來操作關系數據庫。文中分析了基于Hibernate框架的ORM實現策略,結合Struts2.x、Spring和Hibernate三框架集成開發方式,研究了一種基于Hibernate的ORM持久化層的系統架構,該架構利用分層結構的設計思想,利用持久化層實現了業務邏輯層與數據層的分離,降低了開發難度,該架構層次分明,分工明確,在軟件開發中具有較強的應用價值。
[1]丁昊志.對象關系映射模型研究[D].北京:華北電力大學,2006.
[2]The Hibernate Team,TheJBossVisualDesignTeam. HIBERNATE-Relational Persistence for Idiomatic Java[EB/ OL].2015.http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/
[3]唐振明.JavaEE主流開源框架[M].北京:電子工業出版社,2011.
[4]李剛.輕量級JavaEE企業應用實戰[M].4版.北京:電子工業出版社,2014.
[5]劉德山,楊彬彬.基于Hibernate框架的數據持久層架構設計及應用[J].微型機與應用,2011,30(15):12-14.
[6]張云濤,龔玲,周伯鑫.基于關系數據庫管理系統的繼承機制[J].計算機工程,1997(23):42-44
[7]Ming Xue,Changjun Zhu.Design and Implementation of the Hibernate Persistence Layer Data Report System Based on J2EE[C]//2009Pacific-AsiaConferenceonCircuits,Communications and Systems,2009.
Research of object-relational mapping based on hibernate
ZHANG Shao-ying,CHENG Chuan-xu
(The Department of Computer Engineering,Xi'an Aeronautical University,Xi'an 710077,China)
Object relational mapping solves the matching problem of the object-oriented programming language and the relational database.Persistence framework based on object relational mapping realizes the separation of business logic and
data access,simplifies the database access,reduces the difficulty of application development.This paper analyzes the two
kinds of object relational mapping strategy based on Hibernate framework,and compares the advantages and disadvantages of three kinds of inheritance mapping strategy,designs a system architecture based on Hibernate ORM persistence layer.The architecture structure have many advantages of clear framework,high efficiency and higher application value.
inherited relationship;incidence relation;persistence layer;object/relation mapping
TP311
A
1674-6236(2016)06-0128-03
2015-05-18稿件編號:201505147
陜西省教育廳自然科學項目(12JK0951);西安航空學院2014年度校級高等教育教學改革研究項目(2014Z010)
張少應(1976—),男,陜西咸陽人,碩士,講師。研究方向:管理信息系統。