基于Hibernate的对象关系映射研究
2016-09-12张少应程传旭
张少应,程传旭
(西安航空学院 计算机工程系,陕西 西安 710077)
基于Hibernate的对象关系映射研究
张少应,程传旭
(西安航空学院 计算机工程系,陕西 西安 710077)
对象关系映射解决了面向对象程序设计语言与关系数据库存在的互不匹配问题。基于对象关系映射的持久化框架实现了业务逻辑与数据访问的分离,简化了数据库访问,降低了应用开发难度。本文分析了基于Hibernate框架的两种对象关系映射策略,并比较了三种继承映射策略的优缺点,设计了一种基于Hibernate的ORM持久化层的系统架构,该架构结构清晰、开发效率高,具有较高的应用价值。
对象关系映射持久化层继承关系关联关系
在日常开发中,关系数据库表与表之间都存在关联关系,通常使用主键和外键来实现,以此减少数据库中数据的冗余、提高数据访问效率、保证数据库实体的完整性和一致性。Hibernate框架是一个开源的对象关系映射框架,是轻量级JavaEE应用的持久层解决方案,不仅管理Java类到关系数据库表之间的映射,还提供了数据查询、数据缓存等功能,大幅缩短了使用JDBC处理数据持久化的时间。对象关系映射(Object/Relation Mapping,ORM)是为解决面向对象与关系数据库存在互不匹配问题的技术,通过ORM映射,使得开发人员能更好使用面向对象程序设计语言的易用性,以及关系数据库的优势,提高应用程序的开发效率,实现关系数据库存放数据的完整和一致。
基于Hibernate框架的对象关系映射的主要任务是实现数据库关系表与持久化类之间的映射,简化了持久化层数据的访问。开发人员使用面向对象程序设计的方法,以对象为基础,通过操作对象,完成关系数据库的访问。本文分析了基于Hibernate框架的两种对象关系映射策略,比较了3种继承映射策略的优缺点;结合软件分层设计理念,设计了一种基于Hibernate的ORM持久层的系统架构,该持久层专注于数据库交互进行数据的持久化工作,提供一个标准的接口供业务逻辑层调用。该架构具有结构清晰、开发效率高等优点,具有较强现实应用价值。
1 基于Hibernate的对象关系映射策略
对象关系映射大致可以分为继承关系映射和关联关系映射[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),子类和父类之间使用数据库表的主键来设置它们的关联关系;父类实例存放在父类表,而子类实例则由父类表和子类表共同存储。基于该种设计,主表和从表的映射信息都存放在与父类同名的配置文件中,通过<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映射策略的优点在于数据结构清晰,子类的成员属性映射的字段可以不受非空约束。该策略缺点在于子表的主键属性不允许重复;由于同一继承层次中所有实体类必须使用同一主键种子,因此不能使用数据库的自增方式生成主键;父类的属性出现在多张表中,出现数据冗余。
2 基于Hibernate的ORM持久层的设计
软件分层设计具有扩展性强、维护方便、组件重用性高等优点,有利于软件开发的标准化,也便于对整个开发过程的管理,因此被越来越多的开发者使用。基于Hibernate的ORM持久层[7]就是在三层架构的基础上,将持久化层从业务逻辑层中分离出来,使其位于数据库层与业务逻辑层之间,形成了目前比较流行的基于JavaEE的多层软件架构 (如图3)。使用多层软件架构,层次分明,分工明确且相对独立,实现了功能层中业务逻辑和数据逻辑之间的松耦合关系[5],同时也降低了开发成本和开发风险,提高了数据的安全性能。目前基于Struts2.x、Spring和Hibernate框架集成的开发方式,采用面向接口编程的思想,具有良好的分层结构设计,以及开发效率高、通用性好等优点,是企业级基于JavaEE应用开发的首选。而基于Hibernate的对象关系映射技术,本身就是用于简化持久化层数据的访问,该技术在分层设计中的使用,缩短了开发周期,降低了开发难度。
在持久层实现中,DAO层完成连接数据库的增加、删除、修改等实现细节。而Hibernate框架通过ORM映射文件完成关系数据库与POJO类文件之间的关联,结合DAO层实现了底层数据访问操作与业务逻辑的分离,对业务逻辑提供了各类面向对象的数据访问接口,业务逻辑层通过调用DAO接口实现了整个业务方法。
图3 基于SSH2管理信息系统架构
3 结束语
对象关系映射使得关系数据库与对象之间的转换更加透明,开发人员无需关心数据库连接、并发和事务等特性;也改变了以往使用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—),男,陕西咸阳人,硕士,讲师。研究方向:管理信息系统。