admin 管理员组文章数量: 1184232
2024年3月28日发(作者:matlab激活教程2018a)
维普资讯
2007年9月
韶关学院学报・自然科学
Sep.2007
第28卷 第9期
Joumal of Shaoguan University・Natural Science
Vo1.28 No.9
对象/关系映射与Hibernate框架的应用研究
廖福保,张文梅
(广东农工商职业技术学院计算机科学系,广东广州510507)
摘要:目前主流的数据源关系数据库成为面向对象架构中的对象与数据库转换的“瓶颈”,对象/关系映射提供了
沟通对象和关系数据库的桥梁.分析比较了类映射到数据表时的策略;同时利用Hibemate实现了一个具体的对
象/关系映射,提高了开发的效率.
关键词:对象/关系映射;映射策略;Hibernate
中图分类号:TP311 文献标识码:A 文章编号:lOT/一5348(2007)09—0048—04
面向对象技术已逐渐成为应用程序开发的主流,并且逐渐在开发中显示其开发优势;而当今主流数据
库是基于表格的关系型数据库,这就导致了应用程序在处理查询和数据存储时,出现对象与关系不匹配的
问题,使得在持久化过程中遇到很多困难,这就催生了对象/关系映射技术.
1对象/关系映射
使用面向对象的语言访问关系数据库时,一个必须处理的问题是:如何将应用系统对象模型映射到关
系数据库模式.对象模型向关系数据库模式转换得好则可使应用系统的实现得以简化,否则可能大大加重
开发人员的负担,甚至导致系统难以实现或维护困难u J.
以下将讨论的是:对象/关系映射中类映射到数据表的几个策略.提出了利用对象/关系映射框架HiDero
hate来实现对象的持久化,从而节约开发时间和开发成本.
2对象/关系映射中类映射到数据表的几个策略
一
般来说,对象/关系映射应遵循下述原则:(1)对象有唯一的标识,这个标识必须被持久化并作为表的
主键.每个对象对应表中的一条记录.(2)关系数据库表中存储的数据仅为简单数据类型的数据,复杂数据
类型数据需要转化成简单类型数据.(3)对象间有关联关系,需要在关系数据库的表中建立关系,即通过持
久化所关联对象II)的方式保存这种关联关系.
2.1 无继承关系的类的映射
2.1.1一个类映射到一个数据库表.如果一个类是相对独立的,既无父类又无子类,就可以简单地将它要持
久的属性与一个数据库表的列一一映射 j,当然库表中应设置主键(如图1所示).
2.1.2一个类映射到多数据库表.当一个类的某个属
性在几个对象实例中具有相同的属性值时,可以将该
属性单独存储为一个数据表,以避免数据冗余.此时要
将所添加的数据表的主键作为外键放在原数据表中,
使得这两个表关联起来(如图2所示).
图1 一个类映射到一个数据库表
收稿日期:2007—07—3o
作者简介:廖福保(19 一),男,江西宁都人,广东农工商职业技术学院计算机科学系讲师,硕士研究生,主要从事计算机应用与软件开发
维普资讯
第9期 廖福保,等:对象/关系映射与Hibernate框架的应用研究 ・49・
~
2.2 具有继承关系的类的映射
对于比较完善的继承关系一般会有如下共有特点:
首先,只允许一个非接口类型的父类(不被推荐从多个
这样的父类继承),同时允许多个接口类型的父接口;其
茔
图2一个类映射到多个数据库表
ClaSSes
次,父类有可能为抽象类.一般映射中只需考虑能够实
例化的实体类,对于这些实体类,具体的常用映射方案
有三种L3 J.以下举例说明继承的映射方式:基类Person
有两个子类Customer和Employee,关系如图3所示.
2.2.1映射整个类层次到同一个表.每个继承体系用
一
张表存储,只须将父类的属性及子类的扩展属性一一
图3类及其继承关系
Table
name addreSS saluation SSN type
映射为表中的列,并在数据库表中增加一个识别列
type,用以标志不同的类(如图4所示).这种方法的优点
是简单.缺点是增加了类层次结构中的耦合和数据库冗
personOID
余,浪费数据库中的许多空间.
2.2.2映射每个继承路径为单个表.每个实体类映射
到一张表,每个子类对应的表重复包含其所有层级的父
图4映射整个类层次为单个表
类的属性,属于一个继承体系中的每张表包含相同的主键值以表示同一实例;并且,属于每个继承体系中每
张表包含相同的主键值以表示同一实例(如图5所示).由于一个类的所有信息都存储在一个数据表中,数据
表间无须外键联系,因此对于生成报表等功能的实现比较简单,访问单独对象的数据时性能良好.但当对象
模型中某个类的属性改变时,就不得不对该类及其子类的相应数据表一一进行修改
Table
Employee
personOID name addresS Saluation
Table
Customer
personOID name addreSS SSN
图5映射每个继承路径为单个表
2.2.3映射每个类为单个表.为每个类都创建一个数据库表.每个库表只须包含相应类的特有属性。父类
的相应库表的主键设置为其子类的主键和外键,同时在父类的对应表中增加一个字段type用以识别该行代
表的被持久化的实体类类型(如图6所示).这种方法的最大好处就是它能够最好地适应面向对象的概念,它
能够很好地支持多态性;对于对象可能有的每个角色,只需要在相应的表中保存记录;修改超类和添加新的
子类也非常容易,因为您只需要修改或添加一张表.缺点是数据库中有大量的表;读取和写入数据的时间比
较长,因为必须访问多个表.
维普资讯
・
50・ 韶关学院学报・自然科学 2007年
Table Table Table
Person Employee
Customer
personOID name address type
personOID sa1uation
图6映射每个类为单个表
比较映射继承的各种办法如表l所示:
表1三种映射策略
上述三种映射策略各有优缺点,应根据实际情况综合各种因素,选择合理的映射策略,并尽量做到映射
策略的变更对业务逻辑透明.
3对象,关系映射的解决方案Hibernate
Hibernate是一个开放源代码的关系映射框架,Hibernate对JDBC进行了轻量级的对象封装,它不仅提供
了从Java类到关系数据库表之间的映射,也提供了数据查询和恢复机制.Hibernate对每一种数据库都有对应
的1)ialeet进行操作优化,从而提高它在各种情况下的效率Hj.
14_ibemate是利用一些配置文件如Hibernate.c .xml、XML Mapping等来为应用程序提供数据持久化服务
的.Hiebrnate通过SessionFactory提供的Session来对持久化对象进行操作,Session能用于将对象持久化,支持
数据库的事务处理,另外还提供了强大的数据加载功能.
3.1 配置Hibernate
Hibenrated的配置可以使用properites文件和使用XML配置文件进行配置,这里使用XML配置文件进行
配置,配置文件必须命名为Hibernate.c .xml,主要配置数据库连接的各种参数、事务管理以及随项目进展逐
步添加设计的对象,关系映射文件等.针对Person类的配置文件中部分内容如下:
<hibernate—configuration><session—factory>……
<mapp ̄rll ̄o1.1rce=”/eprson.hbm.xml ,></session—factory></hiebrnate—configuration>
其中mapping 属性指名了映射文件是person.hbm.xm1.
3. Bean的编写
Hibernate要持久化的对象可以使用标准的JavaBean,对每个属性都有public的getter和setter方法,命名
符合Bean的命名规则.
3.3 映射文件的编写
这个映射文件说明了持久对象类与关系数据表之间的映射关系,包括持久对象的属性映射到哪个字
段、集合属性映射到哪些相关字段等.映射文件person.hbm.xml的部分内容如下:
<hibernate—mapping><class naII =”Person"table: PERSON”>
<id删【ne= id"type= java.bmg.St ̄ng'column:"personO1]Y><generator class= uuid.hex"/></id>
<property na腓= na腓 type=”S oclumn= na腓”length=”10"/>……
维普资讯
9 福保,等:对象/关系映射与Hibernate框架的应甩研究l : :
</class></hibernate—mapping>
在class标记中指明了实体类及其映射到的数据表的名称.在class标记内,主要有2个标记<id>和<
property>,二者表示类的字段,id代表主键,id中的generator指定了主键的生成方式.property代表普通字段.
标记内有3个必须的属性:nalTle、column和type,分别代表类的属性和映射到数据表中的字段和字段类型.
3.4 实现持久化对象操作
利用Hibernate的Session从数据库中存取记录.首先要从SessionFactory中获取一个Hibernate的Session实
例,然后通过调用Session提供的createQuery、save、merge等方法实现持久化对象的操作.例如数据库更新操作
的关键代码如下:
SessionFactory factory=new Configuration().configure().buildSessionFactory();
Session session=sessionFactory.openSession();
Transaction =session.beginTransaction();
session.merge(person);
.
commit().
利用Hibernate框架可以有效地进行对象到数据库数据的对象/关系映射,Hierbnate使开发人员专心实现
业务逻辑而不用分心数据库方面的逻辑,它同时提供了更加合理的模块划分的方法.
4结束语
对象关系映射的出现有效地解决了对象与数据库间转换的“瓶颈”,为基于数据库的应用开发提供了一
种稳定、高效、扩展性好的解决方案.而利用Hierbnate可以有效地实现业务对象到关系数据库的映射,简化
数据库操作,使得应用开发人员根本无须关心对象持久化的问题.可以预见Hibenrate将在J2EE领域发挥重
要作用.
参考文献:
[1]阮非,陈赫贝.J2EE数据持久层技术及其比较[J].微机发展,2005,15(10):85—87.
[2]王成良,杨祥陵.对象模型向关系数据库模式映射的策略及其应用[J].计算机工程,2004,30(1):155—157
[3]孙栋海,宋顺林.对象/关系映射在.NET框架下的应用研究[J].计算机应用研究,2OO6,z3(8):85—87.
[4]秦敏,李志蜀.利用Hibernate框架简化Java数据库访问[J].计算机应用与软件,2OO6,23(6):46—51.
Application of object/relational mapping and Hibernate framework
LL 0 Fu—bao.ZHANG Wen—mei
(Department of Computer,Guangdong AIB Polytechnic College,Guangzhou 510507,Guangdong,China)
Abstract:Relational database becomes the bottleneck between object and relational database in object-・oriented frame-・
work.Objcte/Relational Mapping provides the bridge between object and relational database.Analyses and compares the
strategies of mappig clnasses to tables.To use Hierbnate framework to implement a real O/R mapping example,the de-
velopment eficifency has been improved evidently.
Key words:objcte/relational mappig;mnappig sntrategies;Hierbnate
(责任编辑:王桂珍)
版权声明:本文标题:对象关系映射与Hibernate框架的应用研究 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1711624684a602383.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论