(计算机应用技术专业论文)对象关系映射模型研究.pdf_第1页
(计算机应用技术专业论文)对象关系映射模型研究.pdf_第2页
(计算机应用技术专业论文)对象关系映射模型研究.pdf_第3页
(计算机应用技术专业论文)对象关系映射模型研究.pdf_第4页
(计算机应用技术专业论文)对象关系映射模型研究.pdf_第5页
已阅读5页,还剩51页未读 继续免费阅读

(计算机应用技术专业论文)对象关系映射模型研究.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

华j b 电力人学硕十学位论文 摘要 随着软件的复杂度和规模不断增长和扩大,业务数据量也在不断增长,各种商 业系统对于关系数据库的依赖程度也越来越强。由于面向对象在前台应用软件中的 。泛应用,需要一套完善的对象关系映射机制( o r m ) 将内存对象的数据持久化到 关系数据库中,因此对象关系映射已成为目前商业软件开发中重要的一部分。本文 针对持久对象与关系数据库的存储矛盾,研究分析了目前比较流行的几种对象关系 映射实现( h i b e r n a t e ,j d o ,i b a t is ) ,深入研究了对象关系映射的方法和相关机制, 设计并初步实现了一个对象关系映射框架:l o r m 。该框架具有对象关系映射功能, 使应用程序开发人员能够以统一的、面向对象的方法进行对象数据存取,而不必关 心底层关系数据库的实现,从而极大地提高了开发效率。基于l o r m 框架的应用开 发简单灵活,并支持s q l 语言和j d b c 标准。文中最后基于l o r m 框架设计并开发 了一个博客应用系统。 关键字:对象关系映射,l o r m ,o r m ,设计模式 a b s t r a c t w i t ht h ed e v e l o p m e n to fc o m p l e x i t ya n ds c a l eo fm o d e ms o f t w a r e ,t h e b u s i n e s sd a t ah a v eg r o w nm o r ea n dm o r e m a n yb u s i n e s ss y s t e m sa r em o r e d e p e n d e n to nr e l a t i o n a ld a t a b a s e ,i na c c o r d i n gt ot h ew i d eu s i n go fo b j e c t o r i e n t e d m e t h o di nt h ef r o n ta p p l i c a t i o n t h e r em u s tb eao b j e e t r e l a i o nm a p p i n gm e c h a n i s m t o m a pt h eo b je c t s i nt h e m e m o r yt o t h ep e r s i s t e n tr e l a t i o n a ld a t a b a s e s o o b j e c t r e l a t i o nm a p p i n gh a sb e e na ni m p o r t a n tp a r to fb u s i n e s ss o f t w a r e a i m e da t t h es t o r i n gc o n t r a d i c t i o nt h a te x i s t e db e t w e e nt h ep e r s i s t e n c eo b j e c ta n dt h e r e l a t i o n a ld a t a b a s e ,t h i sp a p e ra n a l y z e daf e wp o p u l a ro r mf r a m e w o r k s ,r e s e a r c h e d s o m em e t h o do fo b j e c t r e l a t i o nm a p p i n ga n di t sm e c h a n i s m ( h i b e r n a t e ,j d o ,i b a t i s ) p r o p o s e da n di m p l e m e n t e daf r a m e w o r ko fo rm a p p i n g :l o m a s u c hf r a m es u p p o r t s o rm a p p i n g ,w i t hw h i c ha na p p l i c a t i o np r o g r a m m e rc o u l ds t o r eo b j e c t si nu n i f o r m a n do b j e c t o r i e n t e dm e t h o dw i t h o u tc o n c e r n i n ga b o u th o wt oi m p l e m e n to nt h e b o t t o mr e l a t i o n a ld a t a b a s e a n di tw a si m p r o v e dt h e d e v e l o p i n ge f f i c i e n c y g r e a t l y t h ed e v e l o p i n go fa p p l i c a t i o n sb a s e do nl o r mf r a m e w o r kw h i c hs u p p o r t s s q l a n dj d b ci sf l e x i b l ea n de s a y 。f i n a l l y , aa p p l i c a t i o no fb l o gw a sd e v e l o p e d u s i n gt h el o r mf r a m e w o r k d i n gh a o z h i ( c o m p u t e rs c i e n c e ) d i r e c t e db yx nr u z h i k e y w o r d s :o b j e c tr e l a t i o nm a p p i n g ,l o r m ,o r m ,d e s i g np a t t e r n 华j b 电力人学硕十学位论文 摘要 随着软件的复杂度和规模不断增长和扩大,业务数据量也在不断增长,各种商 业系统对于关系数据库的依赖程度也越来越强。由于面向对象在前台应用软件中的 。泛应用,需要一套完善的对象关系映射机制( o r m ) 将内存对象的数据持久化到 关系数据库中,因此对象关系映射已成为目前商业软件开发中重要的一部分。本文 针对持久对象与关系数据库的存储矛盾,研究分析了目前比较流行的几种对象关系 映射实现( h i b e r n a t e ,j d o ,i b a t is ) ,深入研究了对象关系映射的方法和相关机制, 设计并初步实现了一个对象关系映射框架:l o r m 。该框架具有对象关系映射功能, 使应用程序开发人员能够以统一的、面向对象的方法进行对象数据存取,而不必关 心底层关系数据库的实现,从而极大地提高了开发效率。基于l o r m 框架的应用开 发简单灵活,并支持s q l 语言和j d b c 标准。文中最后基于l o r m 框架设计并开发 了一个博客应用系统。 关键字:对象关系映射,l o r m ,o r m ,设计模式 a b s t r a c t w i t ht h ed e v e l o p m e n to fc o m p l e x i t ya n ds c a l eo fm o d e ms o f t w a r e ,t h e b u s i n e s sd a t ah a v eg r o w nm o r ea n dm o r e m a n yb u s i n e s ss y s t e m sa r em o r e d e p e n d e n to nr e l a t i o n a ld a t a b a s e ,i na c c o r d i n gt ot h ew i d eu s i n go fo b j e c t o r i e n t e d m e t h o di nt h ef r o n ta p p l i c a t i o n t h e r em u s tb eao b j e e t r e l a i o nm a p p i n gm e c h a n i s m t o m a pt h eo b je c t s i nt h e m e m o r yt o t h ep e r s i s t e n tr e l a t i o n a ld a t a b a s e s o o b j e c t r e l a t i o nm a p p i n gh a sb e e na ni m p o r t a n tp a r to fb u s i n e s ss o f t w a r e a i m e da t t h es t o r i n gc o n t r a d i c t i o nt h a te x i s t e db e t w e e nt h ep e r s i s t e n c eo b j e c ta n dt h e r e l a t i o n a ld a t a b a s e ,t h i sp a p e ra n a l y z e daf e wp o p u l a ro r mf r a m e w o r k s ,r e s e a r c h e d s o m em e t h o do fo b j e c t r e l a t i o nm a p p i n ga n di t sm e c h a n i s m ( h i b e r n a t e ,j d o ,i b a t i s ) p r o p o s e da n di m p l e m e n t e daf r a m e w o r ko fo rm a p p i n g :l o m a s u c hf r a m es u p p o r t s o rm a p p i n g ,w i t hw h i c ha na p p l i c a t i o np r o g r a m m e rc o u l ds t o r eo b j e c t si nu n i f o r m a n do b j e c t o r i e n t e dm e t h o dw i t h o u tc o n c e r n i n ga b o u th o wt oi m p l e m e n to nt h e b o t t o mr e l a t i o n a ld a t a b a s e a n di tw a si m p r o v e dt h e d e v e l o p i n ge f f i c i e n c y g r e a t l y t h ed e v e l o p i n go fa p p l i c a t i o n sb a s e do nl o r mf r a m e w o r kw h i c hs u p p o r t s s q l a n dj d b ci sf l e x i b l ea n de s a y 。f i n a l l y , aa p p l i c a t i o no fb l o gw a sd e v e l o p e d u s i n gt h el o r mf r a m e w o r k d i n gh a o z h i ( c o m p u t e rs c i e n c e ) d i r e c t e db yx nr u z h i k e y w o r d s :o b j e c tr e l a t i o nm a p p i n g ,l o r m ,o r m ,d e s i g np a t t e r n 声明 本人郑重声明:此处所提交的硕士学位论文对象关系映射模型研究,是 本人在华北电力大学攻读硕士学位期间,在导师指导下进行的研究工作和取得的研 究成果。据本人所知,除了文中特别加以标注和致谢之处外,论文中不包含其他人 已经发表或撰写过的研究成果,也不包含为获得华北电力大学或其他教育机构的学 位或证书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论 文中作了明确的说明并表示了谢意。 学位论文作者签名:委是基、 日期:三! ! :& :! ! 关于学位论文使用授权的说明 本人完全了解华北电力大学有关保留、使用学位论文的规定,即:学校有权 保管、并向有关部门送交学位沦文的原件与复印件:学校可以采用影印、缩印或 其它复制手段复制并保存学位论文;学校可允许学位论文被查阅或借阅;学校 可以学术交流为目的,复制赠送和交换学位论文:同意学校可以用不同方式在不同 媒体上发表、传播学位论文的全部或部分内容。 ( 涉密的学位论文在解密后遵守此规定) 作者签名:、互曼委 日 期:至女0 6 厶= 主9 导师签名: 日期: 主釜查竖 圭塑:6 = 婴 华北电力大学硕十学位论文 第一章引言 1 1 研究背景 各种应用软件的开发都不可避免要使用到内存数据的持久化,使各种数据能够 长时间保存并持续使用。就现阶段而言,关系数据库是大多数软件系统数据存储的 首要选择。关系数据库的理论非常完善,并且得到了数寸年的实践考验,不论从性 能还是数据完备性的角度,关系数据库都有着无可比拟的优势。另一方面,面向对 象技术是应用于新软件系统开发的最常见的环境。现今,面向对象的开发方法已成 为了软件丌发的主流。随着软件复杂度和规模的增加和扩大,出于软件的可重用性 和可维护性的考虑,各种面向对象的持久化方法也随之产生。 对象模型基丁软件工程的一些原理,例如抽象,封装,继承和多态,而关系数 据模型则基于数学原理,特别是集合论的原理。两种不同的理论基础导致各自有不 同的优缺点。对象模型侧重于从包含数据和行为的对象中构造应用程序,而关系数 据模型则主要针对数据的存储。对象模型和关系模型之间的这种失配叫做阻抗不匹 配。使用对象模型,是通过对象问的关系来访问对象;而使用关系数据模型,则通 过冗余数据来连接表中的行。采用关系数据库的面向对象的软件项目应用都必定要 涉及对象模型与关系数据模型之间的交互,由于面向对象的模型和关系数据模型的 阻抗不匹配,当系统中的对象存储在关系数据库中时,就需要进行对象与关系的映 射。对象关系映射是数据在关系模型和对象模型之间的相互转换的过程。 1 2 对象关系映射的研究现状 目前实现对象关系映射有以下几种方案。 1 2 1 在业务类中硬编码 这种模式的好处是写代码效率高,对于小型应用程序或者原型是可行的。缺点 是直接耦合了业务类与关系数据库结构,这意味着任何小的改变( 例如对某一列重 命名或者移植到另外一种数据库) 都导致源代码级的修改,使代码难于维护和扩展。 1 2 2 在存储过程或者单独的数据类中硬编码 在这种方法中,业务类的持久化操作被封装在一个或者多个数据类中,但是在 对数据库进行改动后,仍然需要修改和重新编译数据类。这种方法也只适合原型或 者业务类较少、不会频繁修改的小型系统。 1 2 3 使用容器管理实体b e a n 这种方法是把大部分的数据完整性、资源管理和并发性交给e j b 容器处理,从 华北电力大学硕士学位论文 而使开发人员关注业务逻辑和数据处理,而不必处理这些底层细节。使用b e a n 管 理的持久性实体b e a n ( b m p ) 时,开发人员编写持久性代码而容器确定何时执行该 代码;使用容器管理的持久性实体b e a n ( c m p ) 时,容器生成持久性代码并管理持 久性逻辑。然而e j b 规范在实践中被证明是失败的设计。c m p 引擎因厂商而异,映 射元数据高度特定于厂商,导致实体b e a n 实际上是不可移植的。另外,实体b e a n 不支持多态的关联和查询,无法满足细粒度的领域对象模型。 1 2 4 使用对象关系映射框架 o r m 即“对象关系映射组件”。在目前的应用系统中,大多数情况下,我们必 须同时厦对对象和关系型数据进行开发。在业务逻辑层和表现层,我们将系统中的 各参与实体进行面向对象的封装,并将现实世界中的逻辑进行高度抽象后,用面向 对象语言实现。而另一方面,在数据持久层,追于目前数据库技术发展的现实,必 须在现有的关系型数据库模型上进行持久化实现。这样一来,就面临着怎样将面向 对象的设计与传统关系型数据进行整合的问题。o r m 框架的出现f 是解决了这个问 题。在业务层和数据库之间增加一个对象关系映射组件( o r m ) ,负责实现对象和 关系数据库之间的映射。利用这个o r m 框架,对象与关系数据库之问的转换就可 以透明地进行,丽不用去关心数据库连接、并发性和事务等问题,即业务层就可以 直接获取或存储对象,中间的转换过程就交给o r m 框架处理了。这样就可以避免 数据库结构或类中任何方发生变化时对系统的大幅修改。在不同的面向对象语言 环境中,实现对象关系的映射会有不同的方法,因为通常会利用到一些属于语言特 有的技术。围绕对象关系的映射和持久数据的访问,在j a v a 领域中发展起来了一些 o r m 框架。o r m 框架的优点有: 1 、减少重复代码 持久层编码大多是冗长、重复性的编码,o r m 框架封装了数据库持久层的大多 数技术细节,如事务管理,数据库连接管理,s q l 生成等。得益于这些优秀的底层 实现,我们可以从重复代码中解脱开,集中精力于业务逻辑。 2 、更加面向对象的设计 o r m 为系统设计提供了更加自然的实现方式。可以通过o r m 将系统的域模型 自动映射到数据库表,从而在编码中只需关一t 5 , 对象,而不再面对关系模型数据。 3 、更好的性能优化 o r m 框架提供了优秀的性能优化机制,如内置的连接池,数据缓存等。这些优 化机制的综合使用大大提升了系统性能。更重要的是,由于设计上更加全面的考虑, 这些机制对于上层应用完全透明,无需关心其中复杂的实现细节即可享受到其带来 的性能提升。 4 、更好的移植性 华北电力大学硕士学位论文 基于j a v a 的跨平台特性,系统可以在不同操作系统之间切换。但由于数据库之 间的差异,在数据库平台之间的迁移遇到了阻力。o r m 设计上的良好隔离,提供了 对不同数据库的良好支持。对象关系映射可以达到提高开发效率,降低开发成本以 及问题复杂度的目的。对象关系映射的重要作用是它消除了开发人员编写低级数据 访问代码的需要,这在某些应用中能够极大地提高开放效率,从而保证应用代码专 心的处理对象,并能够创建可以支持多个用例的域对象模型。 综上所述,使用o r m 框架构建持久层是目前较理想的解决方案,本文将以此 作为研究内容。 1 3 论文主要研究内容及意义 本文的研究目标是分析和研究o r m 框架中的关键技术,设计一种有效的o r m 框架并加以应用。本文的研究内容如下: 1 、着重研究一种优秀的o r m 实现:h i b e r n a t e ,对其关键技术进行分析,剖析 其设计理念。 2 、对比其他o r m ( h i b e r n a t e ,j d o ,i b a t i s ) 实现,研究比较其异同,分析其优 缺点。 3 、设计自己的o r m 框架一l o 舯。 4 、设计并开发一个基于l o r m 框架的博客应用系统。 1 4 本文的组织 本文的组织结构安排如下: 第一章论述了本课题的研究背景与意义,介绍了持久层的概念及实现方式,提 出了课题研究的基本内容和目标。 第二章对o r m 实现技术进行了具体的分析。 第三章介绍了h i b e r n a t e 框架,并进一步分析其关键技术。 第四章对其它两种流行的o r m ( j d o ,i b a t i s ) 实现进行了分析,比较其优缺点。 第五、六章提出自己的观点,设计并实现自己的o r m 框架一l o r m 。 第七章是实现基于l o r m 的应用。 第八章总结了工作中的经验与不足,并提出了可能需要进一步研究的内容。 华北电力大学硕十学位论文 第二章o r m 概述 如前所述,对象模型基于软件工程的一些原理,而关系数据模型则基于数学原 理,特别是集合论的原理。面向对象设计的目标是通过把一个业务过程分解成具有 标志,状态和行为的对象来建模一个业务过程。而关系数据库的设计目标是规范化 数据以消除数据冗余度。两种不同的理论基础导致对象模型与关系数据模型之间的 阻抗不匹配。面向对象模型和关系数据模型的阻抗不匹配使得进行对象关系映射时 存在着许多问题。关系数据库不支持诸如类,继承,封装和多态等面向对象的概念。 对缘关系映射是在对象与数据库之间进行映射的一种技术,对象问的关系、类及其 属性必须以某种方式映射为关系数据库中的数据库关系、表和字段。 针对对象模型与关系数据模型问的阻抗不匹配,人们提出了一些解决方案来进 行对象模型向关系数据库模型的映射,由于数据库是以二维表为基本管理单元的, 所以在使用关系数据库的面向对象软件应用中对象模型最终是由二维表以及表间 关系来描述的。而这其实就是一个类与数据库表的变换过程。从某些方面看来,在 对象与关系数据库表的行之间有着很多共同点。对象是类的实例,它的内部数据的 结构以及其他一些特征由某个类定义。类似地,关系数据库的脚本定义了数据库表 的结构,例如表包含哪些字段等。类的实例与数据的行以相似的方式存储数据。通 常一个类可以映射为个或一个以上的关系数据库的表,类属性将映射成关系数据 库中的字段,而对象间的关系可以通过使用关系数据库中的外键来维护。对象关系 映射的解决方案一般是把每个对象映射到数据库表的单个行上,这一行通常来自一 个表,也可以由一个表的连接操作产生。 在这一章中,将讨论一些将对象映射为关系数据库所需的基本技术。当然,这 些基本技术只是普遍的变换规则,有些对象关系映射框架可能会采用不同的变换规 则,那就要看具体实现的对象关系映射框架。 2 1 类型的映射 将属性映射成列时通常的情况是一个类属性映射到一个表的列。当类的属性和 表的列是相同简单类型时,直接进行一对一的映射就可以。j a v a 的数据类型系统不 同于s q l 的数据类型系统。j a v a 中的基本数据类型能够直接映射到确切的s q l 类 型,但是当需要映射的类属性类型不是简单类型或者是关系数据库不支持的类型 时,问题就比较复杂。例如,大多数关系数据库并不支持类属性中常见的b o o l e a n 类型,这时就要将其映射成字符型或数值型的列。 另外需要注意的是,并不是所有类属性都是需要持久化的,即并非所有的属性 都需要映射成列。例如,订单类可能会有总额属性,这个属性由其订单对象实例在 计算时使用,但它并不需要保存到数据库中,所以无需对其进行映射。 华北电力人学硕十学位论文 2 2 继承映射 继承关系是关系型数据与面向对象数据结构之间的主要差异之一。o o 模型中 对象问有继承关系,而关系数据库无法直接支持对象问的继承关系,所以在关系数 据库中表示继承层次关系时,会存在如何为已映射到关系数据库上的对象中的继承 性建立模型的问题。如何在关系型数掘库的基础之上,通过继承关系得到清晰合理 的层次划分是实体层次设计中的一个关键问题。而o r m 要解决的问题就是怎样实 现基本的继承关系到数据库表间关系的映射。 类与表的映射通常不是直接的。除了非常简单的数据库以外,通常不会是类与 表的一对一映射。将继承映射到关系数据库中有三种基本策略,这三种策略采取不 同的方法将类映射到表来实现有继承关系的类层次。 l 、整个类层次结构使用个数据实体( t a b l ep e rc l a s sh i e r a r c h y ) 。 使用这种方法,可以将一个完整类层次结构映射成一个数据实体,而层次结构 中所有类的所有属性都存储在这个实体中,实际上这种方法就是将整个类层次中所 有类存储在数据库的一张表中。这种方法的优点是简单,因为类层次中的所有数据 都可以在一张表中找到,支持多态性。缺点是每次在类层次结构的任何地方添加一 个新属性时都必须将一个新属性添加到表中。这增加了类层次结构中的耦合,即如 果在添加一个属性时有任何错误,除获得新属性的类的子类外,还可能影响到层次 结构中的所有类。它还可能浪费数据库中的许多空间。此外还必须添加o b j e c t t y p e 列来代表是哪个子类。 2 、每个具体类使用一个数据实体( t a b l ep e rc o n c r e t ec l a s s ) 。 使用这种方法,每个数据实体既包含属性又包含它所表示的类继承的属性,实 际上这种方法就是将类层次中的具体类分别存储在数据库的一张表中。这种方法最 大的好处是能相当容易地执行查询,只要将所需的有关单一类的所有数据都只存储 在一张表中。但也有几个缺点。第一是当修改类时,必须修改这个类对应的表和它 所以子类对应的表。第二,很难维护数据完整性。 3 、每个类使用一个数据实体( t a b l ep e rs u b c l a s s ) 。 使用这种方法,为每个类创建一张表,它的属性是i d 和特定于该类的属性, 实际上这种方法就是将整个类层次中的所有类都分别存储在数据库的一张表中。这 种方法的最大好处就是它能够最好的适应面向对象的概念,能够很好的支持多态 性。修改超类和添加新的子类也非常容易,因为只需要修改或添加一张表。这种方 法也有几个缺点。第,数据库中有大量的表,实际上每类都有一个。第二,使用 这种技术读取和写入数据的时间比较长,因为必须访问多个表。 2 3 引用完整性 华北电力人学硕+ 学位论文 在o o 模型中对象可以仅仅看作是类的简单实例,但在规范化的数据库模式中 问题就远没有那么简单。这是因为对象间存在着复杂的关系,这些关系包括关联, 聚集和组成。利用o o 模型可以简单建立的这些关系在关系数据库中就需要耗费大 量的时间和精力来维护,并带来了极大的复杂性。例如,在对象模型中简单的多对 多关系在关系数据库中就可能需要复杂的外键管理策略。 在j a v a 运行时系统中,只要至少有一个对象引用,j a v a 对象就会存在。这就是 我们熟悉的j a v a 垃圾收集。然而,持久性对象通常是显式的删除。关系数据库长期 以来有自己的机制,避免外键引用不存在的主键。将这2 种观点组合起来就是o r m 需要解决的问题,通过显式支持关系引用完整性限制,并在需要的时候执行正确的 语句顺序,或者通过支持级联删除选项,可以解决这个问题。 2 4 透明的持久- 陛 在j a v a 对象模型映射到表以后,对象关系映射实现必须能够通过某种方法来读 写对象。关系数据库的基本操作是查询、插入、更新和删除。透明持久性的基本想 法是隐藏直接的数据库操作。更进一步的目标是最小化数据库的访问。可以通过从 内存缓存中读取已知数据并仅更新修改过的对象甚至字段,来达到这个目的。由 o r m 框架提供的工具创建了字段访问方法后台所需要的代码,以此来透明的执行适 当的s q l 语句。尽管可以手工实现所有的方法,但那样相当繁琐。p o j o ( p l a i no l d j a v ao b j e c t ) 就是一个简单的j a v ab e a n ,不做特殊的处理是无法自行实现o r m a p p i n g 的各种操作的。因此需要对j a v ab e a n 进行所谓的增强,就是为j a v ab e a n 添加状态管理,比如每个g e t t e r s e t t e r 增加状态判断,如果g e t t e r 所对应的属性还没 有被从数据加载,就发起s q l 去加载这个属性。这些新增加的操作需要以某种方式 添加到p o j o 中。添加的方式主要有三种:自动增添源代码;通过动态字节码生成 在运行期间实现状态处理;编译期在字节码中植入状态处理代码。 自动添加源代码由于潜在的被错误改动的危险和维护工作增多,很少被o r m 框架采用。通过动态字节码生成是一个很理想的添加状态处理过程的方法,被著名 的开源o r m 框架h i b e r n a t e 采用( 通过丌源的c g l i b ) 。动态字节码生成的好处是 简单,增强过程对开发人员完全不可以见。缺点是启动时间长( 由于要在第一次加 载p o j oc l a s s 到j v m 的时候要做动态产生字节码) 和内存占用较多( 由于要缓存产 生的字节码) 。编译期字节码生成的优点是静态增强的启动效率高和占用内存少,缺 点是对于使用d e b u g g e r 柬调试时需要在编译时多一个步骤。 2 5 唯一性鉴别 o o 模型中的对象都必须有a 己的唯一的对象标识符以区别于其他对象。以j a v a 华北电力大学硕士学位论文 对象为例,在某个j a v a 虚拟机中的j a v a 对象是通过在某确定时刻该对象的引用来 区别于其他对象。两个对象可以拥有相同的状态,但他们必须具有不同的对象标识 符。同样的,关系数据库中的行之间必须可以相互区分,而这种区分是通过每个数 据库表中的行必须具有的唯一不重复且不为空的主键来进行的。我们面临的问题是 如何在关系数据库中表示对象的唯一性,即如何在数据库表的主键与对象标识符之 间建立映射。 j a v a 中每个对象都有基于j v m 中存储单元的隐式对象身份。而关系数据库中 关系的视图是基于主键和外键的。将类映射成关系数据库的表时,对象标志符的映 射是一个相对简单的问题,通常将对象标志符映射成数据库的主键即可,并在每次 在数据库中存储新对象时为该对象在数据库中生成一个新的主键。问题在于如何选 择主键和主键的生成策略。 在真实的应用程序中,绝对不要用任何与业务相关的对象属性作为数据库中的 主键,因为这样只会带来麻烦。主键值应该是一个对象独一无二、不可变更的身份 标识,而那些业务相关的身份标志都是可能变更的,只是目前的业务或许不允许它 变更而已。比如,如果一个居民登记系统用身份证号码作为主键,当身份证号码从 1 5 位升级到1 8 位时,将会带来很大的麻烦。所以,当要实现对象关系映射时,应 该使用代理主键,即没有业务含义的主键。代理主键更加容易处理,并且可以产生 更好的性能,以及不受业务规则变化的影响。 主键的生成是我们面l 临的另一个问题,用于主键生成的策略通常有如下两种: 1 、 在程序语言中生成一个唯一的i d 在这种方法中,代理主键的生成完全是在数据库外部进行的。可以使用这样一 个算法:它保证每当一个键生成时,这个键都是唯一的。这样的算法通常都基于一 个随机数、系统时间和服务器的i p 地址的一种组合。在程序语言中生成一个唯一i d 由于与数据库无关所以是快速和可移植的。但是,它有一些缺点: ( 1 ) 它生成很长的键,无论该表将保存多少行; ( 2 ) 键是字符串,不是数,因而可能会使数据库中的索引变得复杂; ( 3 ) 键不是顺序的。这种方法忽略了数据库的能力,并硬要在程序语言能力弱 的地方使用它,是复杂、低效率的方法。 2 、 使用一个生成主键的存储过程或其他数据库特有手段生成唯一i d 在这种方法中,代理主键的生成通过自增列或其他数据库特有方法来解决。由 于主键的创建是一个根本的数据库问题,所以每个数据库都提供了一种在多个用户 创建行时最大限度地减少争用的快速方法。这种方法充分利用了数据库的能力,从 而消除了程序语言中生成唯一i d 所固有的缺点,是简单、高效、低消耗的方法。 它的缺点是:由于利用了数据库特有手段而不具有好的可移植性。但是可以通过在 软件应用中精心的设计来提供在不同数据库问的移植性。 一7 华北i 乜力人学硕十学位论文 第三章h i b e r n a t e 框架分析 h i b e r n a t e 是一个优秀的开源o r m 实现框架,目前被j b o s s 组织收纳,成为j b o s s 组织的子项目之一。h i b e r n a t e 强大的功能和全面的设计使得其在丌源领域得到极大 关注和应用,目前已逐渐发展成j a v a 持久层的事实标准。 3 1h ib e t n a t e 体系结构 如图3 一l 所示,h i b e r n a t e 将底层数据库和j d b ca p i 彻底封装,对上层应用只暴 露h i b e r n a t ea p i ,很好地完成了持久层设计的目标,但也正因此造成了h i b e r n a t e 学习曲线高、不易掌握。通过h i b e r n a t e 完成持久化需要有良好的面向对象设计。 圜 戊 一一u 图3 1h i b e r n a t e 结构图 3 2 映射机制 3 2 1 简单映射 1 、h i b e r n a t e 数据类型 在进行h i b e r n a t e 实体属性映射关系定义时,需要提供属性的数据类型设定,通 过这些类型定义,h i b e r n a t e 即可完成j a v a 数据类型到数据库特定数据类型的映射 关联。下面的示例就是h i b e r n a t e 将i n t e g e r 类型的属性a g e 映射到库表字段a g e : i n t e g e r 是h i b e r n a t e 提供的基本数据类型之一。h i b e r n a t e 中提供了丰富的数据 类型支持,其中包括了传统的j a v a 数据类型,如s t r i n g 、i n t e g e r ,以及j d b c 数据 类型,如c l o b 、b l o b 等。除此之外,h i b e r n a t e 还提供了用户白定义数据类型支持。 h i b e r n a t e 基本数据类型覆盖了同常开发中所需的绝大多数情况,它提供了传统数据 库类型与j a v a 数据类型之间的连接纽带。 2 、实体映射 华北电力大学硕十学位论文 实体映射技术作为类与表之间的联系纽带,在o r m 实现中起着至关重要的作 用。对h i b e r n a t e 用户丽言,映射关系体现在配置文件的维护中。h i b e r n a t e 选用x m l 作为映射配置文件的基础形式。x m l 良好的扩展性,清晰的结构和强大的表现能力 为配蜃文件的维护带来了巨大的方便。 3 2 2 关联映射 莳面讨论的是单一实体到表的映射,而在面向对象的领域,对象【、日j 的关系千丝 万缕,怎样将这复杂的对象关系( 或者称为对象图) 映射到数据库中,是o r m 需 要解决的关键问题。h i b e r n a t e 是通过定义引用类型来实现关联映射的。当在映射文 件中定义关联关系时,h i b e r n a t e 会将这种关联关系解释为一种引用类型,而不是直 接的对应到具体类型( 如s t r i n g 等) 。接下来,在创建对象时,如果发现此对象有个 属性是引用类型,那么h i b e r n a t e 会将这个属性做特别处理,根据表之间的关联找到 引用的对象( 表) ,利用数据库的关联查询找到和这个对象相关联的对象并设霞它 们的关联关系。同理,在修改、删除这个引用属性时,h i b e r n a t e 都会区别对待,遇 到引用属性会做相应的表连接处理,而不是像对普通属性那样的直接操作单表字 段。 32 3 实体对象的生命周期 1 、实体的三种状态 ( 1 ) t r a n s i e n t 还未经h i b e r n a t e 处理的j a v a 对象就是处于t r a n s i e n t 状态,这时的实体对象与 数据库中的记录无关。 ( 2 ) p e r s i s t e n t 处于被h i b e r n a t e 框架所管理的状态就是p e r s i s t e n t 的,这时的实体对象就是持 久对象,也叫p o ( p e r s i s t e n t o b j e c t ) 。在这种状态下,实体对象的引用被纳入h i b e r n a t e 实体容器中加以管理,p o 的状态是对应数据库中记录的,对p o 的改变最后会同步 到数据库。 ( 3 ) d e t a c h e d 在对应的s e s s i o n 实例关闭之后,p o 就变为d e t a c h e d 状态。处于d e t a c h e d 状 态的对象可以再次与某个s e s s i o n 实例关联而成为p o 。处于d e t a c h e d 状态的对象不 会与数据库记录同步,这一点和t r a n s i e n t 状态的对象相同。 2 、实体对象识别 在j a v a 中,对象之间的比较通过以下2 种方式: ( 1 ) 引用比较( = = ) 。 引用比较的作用是判断2 个变量是否引用了同一个对象实例。 华北电力人学硕十学位论文 f 2 1 内容比较( e q u a l s 方法) 。 内容比较的作用是判断2 个对象所包含的数据是否相同。 以上2 种方式是j a v a 中对象比较的基本形式,基于这种机制,我们可以方便地 分辨对象之间的差异。而对于持久层逻辑,我们必须重新审视如何判断2 个实体对 象是否相同。从数据库角度来说,一条记录就代表了一个实体,换句话说,如果有 2 个实体对象对应了同条记录,那么从数据库角度来晚,这2 个实体对象应该是 同一的。所以,持久层逻辑的引人,让j a v a 中的对象识别语义发生了变化。所以, 实体对象识别也是o r m 必须解决的一个问题。 h i b e r n a t e 实现了事务范围内的实体对象识别。即h i b e r n a t e 保证在同一s e s s i o n 实例中,一条数掘库记录唯一对应一个实体对象。当使用同一s e s s i o n 实例加载同 一记录时,h i b e r n a t e 返回的是同“一个实体对象。 3 3 高级特性 33 1 事务管理 h i b e r n a t e 是j d b c 的轻量级封装,本身并不具备事务管理能力。在事务管理层, h i b e r n a t e 将其委托给底层的j d b c 或者j t a ,以实现事务的管理和调度。 3 3 2 延迟加载 为了避免在某些情况下,关联关系所带来的无谓的性能丌销,h i b e r n a t e 引入了 延迟加载的概念。如,采用延迟加载技术,在u s e r 对象加载时,并不加载其关联的 a d d r e s s 对象,只有在确实需要使用a d d r e s s 对象时,爿去加载它。延迟加载,就是 在需要数据的时候,j 真币执行数据加载操作。这样一来,避免了因为关联关系而 导致的读取无用数据的开销,提升了系统性能。h i b e r n a t e 中的延迟加载用于实体对 象和集合( c o l l e c t i o n ) 。 l 、实体对象的延迟加载 打丌实体对象延迟加载功能时,h i b e r n a t e 在运行时会生成实体对象的代理,并 将此代理返回给客户端,通过此代理,h i b e r n a t e 实现了透明的实体对象延迟加载。 只有客户程序真正调用实体类的方法时,h i b e r n a t e 才会执行数据库查询操作加载实 体对象。 2 、集合的延迟加载 h i b e r n a t e 延迟加载机制中,关于集合的延迟加载特性意义最为重大,也是实际 应用中相当重要的一个环节。因为集合往往对应了大量的实体对象,这时如果不采 用延迟加载机制,可能读取的无用数据将是可观的。 为了实现透明化的延迟加载机制,h i b e r n a t e 进行了大量努力。其中包括j d k 华北电力大学硕十学位论文 c o l l e c t i o n 接口的独立实现。由于拥有自身的c o l l e c t i o n 实现,h i b e r n a t e 就可以在 c o l l e c t i o n 层从容的实现延迟加载特性。只有程序真正读取这个c o l l e c t i o n 时,才激 发底层实际的数据库操作。 3 3 3 缓存 在特定硬件基础上,缓存往往是提升系统性能的关键因素。而对于o r m 实现 而言,缓存则显得尤其重要,它是持久层性能提升的关键。相对j d b c 数据存取, o r m 实现往往需要借助更加复杂的机制,以实现内部状态的管理、o r 关系的映射 等。这些额外的开销是的o r m 数据访问效率相对较低。如何弥补这里产生的性能 差距? 数据缓存是其中的一个关键策略。 缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的临时拷 贝,位于数据库和数据访问层之间。h i b e r n a t e 数据缓存分为2 个层次:内部缓存( 一 级缓存) 和二级缓存。h i b e r n a t e 的s e s s i o n 提供了一级缓存,每个s e s s i o n ,对同一 个i d 进行两次l o a d ,不会发送两条s q l 语句给数据库,但是s e s s i o n 关闭的时候, 一级缓存就失效了。二级缓存是s e s s i o n f a c t o r y 级别的全局缓存,底层可以使用不 同的缓存类库,比如e h c a c h e 、o s c a c h e 等。 3 3 4 多样的查询方式 h i b e r n a t e 作为优秀的o r m 实现,提供了多样的查询方式,为应用程序提供了 丰富的查询接口。 1 、c r i t e r i aq u e r y c r i t e r i aq u e r y 通过面向对象的设计,将数掘查询条件封装为一个对象。h i b e r n a t e 在运行期会根据c r i t e r i aq u e r y 中指定的查询条件生成对应的s q l 语句。这种方式 的特点是比较符合j a v a 程序员的编码习惯,并且具备清晰的可读性。不少o r m 实 现中都提供了类似的实现机制。 2 、h q l 相对于c r i t e r i aq u e r y 提供了符合面向对象编程风格的查询模式,h q l 则提供 了更加丰富灵活的特性,它在涵盖了c r i t e r i aq u e r y 功能范围的| j 提下,提供了更加 强大的查询能力。h q l 是h i b e r n a t e 官

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论