(运筹学与控制论专业论文)基于对象关系映射理论的持久框架在java中的设计与实现.pdf_第1页
(运筹学与控制论专业论文)基于对象关系映射理论的持久框架在java中的设计与实现.pdf_第2页
(运筹学与控制论专业论文)基于对象关系映射理论的持久框架在java中的设计与实现.pdf_第3页
(运筹学与控制论专业论文)基于对象关系映射理论的持久框架在java中的设计与实现.pdf_第4页
(运筹学与控制论专业论文)基于对象关系映射理论的持久框架在java中的设计与实现.pdf_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

摘要 摘要 目前,大多数企业应用系统都采用面向对象技术与关系数据库相结合的开 发方式,这意味着数据需要在对象模型和关系模型1 日j 进行转换。这就引出了对 象模型和关系模型之间的阻抗不匹配问题。以往的解决方案在实际操作中遇到 了一些问题,一个较好的替代方案是在应用层与数掘库问使用一个持久框架, 使用对象关系映射解决两种模型转化问题,同时将数据库访问封装起来,实现 数掘的透明持久化。 本文介绍了对象模型与关系模型的各自特点,基于对象关系映射理论,针 对j a v a 平台详细分析了映射实现策略,包括映射对象属性、映射类、映射关系、 映射继承结构,并对j a v a 中的集合框架以及j a v a 5 o 中支持的枚举特性提出了完 备的映射方案。本文设计了一种框架以满足一般应用系统的要求。它实现了构 建关系数据库的持久层的基本目标:一方面要解决对象关系模式不匹配的问题, 另一方面要保证数据访问中间层需要的事务、并行、丌发效率等方面的要求。 在最后对框架的设计细节进行了描述与说明。 实践表明,基于对象关系映射的对象持久框架将关系数据库的访问进行封 装,从而实现了对象的透明存储,再加上缓存和延迟加载等性能优化手段,较 为高效地实现了面向对象丌发与关系数据库二者的结合。 关键字:对象关系映射;j a v a :持久框架;关系数据库 a b s t r a c t a b s t r a c t n o w a 出l y s ,al o to fe 1 1 t e r p r i s es o r w a r es y s t e m sw e r ed e v e l o p e dw i t i im e o b j e c t o r i e m e dt e c h n i q u ea 1 1 dr e l a t i o n a ld a 切【b a s e t h e “i m p e d a l l c em i s m a t c h ”c o m e s i m op l a yw h e ny o u1 0 0 ka tt h ep r e 勋e d 印p r o a c ht oa c c e s s :i no b j e c tp 枷i g my o u 仃a v c r s eo b j e c t sv i at h e i rr e l a t i o n s l l i p sw h e r e a si nr e l a t i o n a lp a r a d i g my o ud l l p l 主c a t e 妇t 0j o i nt t l er o w si 1 1t a b l e s t h e r ea r es o m ed i s a d v a i i t a g e si nt 王1 ep r a c t i c e 、j l ,i t ht t l e u s e ds o l u t i o n st h a tc o m b i n e so b j e c t - o r i e m e dt e c h n i q u ea n dr e l a t i o n a ld a t a b 船ei i l b u i l d i n ge m e r p r i s e s o 丘w a r es y s t e m ,as u b s t i t l l t e ds o i m i o ni st h ep e r s i s t e n c e 胁e w o r k ,w h i c hi m p l e m e n t c dt h ea c c e s st 0m ed a t a b a s ew i t l l 曲ef o 珊o f e n c 印s u l a t i o n ;t b e r e f o r e ,i ti m p l e m e n t e dt h ep e r s i s t e n c eo fo b j e c t 、i t hm ed e t a i l s h i d e d i n t h i sp 印e rt 1 1 eo b j e c tm o d e lw a sc o m p a r e dw i t l lt l l er e l 撕o n 硝m o d e l ,锄d o b j e c t - r e l a t i o n a lm 印p i n gt h e o r yw a sp r e s e n t e d ,w h e r e a f t e rt l l em a p p i n gs t r a t e g i e si n j a v ap l a t f b r r nw 鹤a 1 1 a l y z e dc o n s i s t i n go fm 印p i n gc l a s s sa n 曲u t e ,m 印p i n gc l a s s , m a p p i n gs h a d o wi n f o 啪a t i o n ,m 印p i n gi n h e r i t a n c e ,m a p p i n ga s s o c i a t i o n a r l d m a p p i n gc o l l e c t i o n 行a m e w o r ka n dm 印p i n ge n u mw a sg i v e n ap e r s i s t e n c e 舶m e 、v o r k s a t i s f y i n gr e q u i r e m e n t o ft h ea p p i i c a t i o ns y s t e m sw a sg i v e n n i m p l e m e n t e dm e 缸1 c t i o i l sw h i c hc o u p l ew i t l lm e “i m p e d a n c em i s m a t c h ”锄d s a t i s f i e dt h ed e m a n d si 1 1t h ed o m a i no ft r a n s a c t i o n s ,c o n c t l r r e n c ya n dp e r f b r i t l a n c e a n dt h ed e s i g nd e t a i l sw e r ei n c l u d e di nt h i sd i s s e r t a t i o n t h er e s u l t ss h o w e dt h a tt h ep e r s i s t e n c ef r 啪e w o r kb a s e do nt h eo b j e c t - r e l a t i o n m a p p i n gi s ag o o ds o l u t i o nt h a tc o m b i n e so b j e c t o r i e n t e dt e c t u l i q l l ca i l dr e l a t i o n a l d a t a b a s ei nb u j 】d i n ge n l e r p :r i s es o f i ,a r es y s t e m k e y w o r d s :o b j e c t r e i a t i o nm 印p i n g ;j a v a ;p e r s i s t e n c e 矗锄e 、o r k ;r e l a t i o n a l d a t a b a s e i i 第一章绪论 第一章绪论 第一节研究背景 数据是任何计算机应用程序最重要的方面。在企业环境中,数掘不仅必须 是可访问的,而且还必须是持久的。持久数掘存储就是即使在服务器崩溃的情 况下仍能存在的数据存储。持久数据存在于应用程序的活动内存之外,通常在 数据库或平面文件系统中。虽然持久数据被读入瞬时存储器以供使用或修改, 但它始终被写到外部数掘存储中以长期存储。 自从2 0 世纪6 0 年代面向对象技术出现,数十年来该技术在广度和深度上 不断发展、成熟,逐渐成为被广泛采用的行业标准,面向对象的应用程序开发 目前已经是信息技术的主流。几乎所有的应用程序都需要在一个持久化的存储 系统中存放和取回信息,而对面向对象的应用程序而言这项持久数据存储工作 就围绕着持久化对象展丌。持久化对象就是需要被存储在持久化存储系统中的 对象。对象的持久化存储系统,可以选择对象数据库、对象关系数据库、关系 数据库甚至层次数掘库或普通数据文件。但是由于关系数据库的理论非常完善, 并且得到了数十年的实践考验,不论从性能还是数据完备性的角度,目前关系 数据库都有着无可比拟的优势。所以现阶段丌发软件系统时在使用面向对象技 术的同时常常使用关系型数掘库进行持久数掘存储。 这一事实既有积极的一面又有消极的一面。从积极的方面看,面向对象技 术和关系数掘库都各有几十年的发展,它们都通过实践证明了它们的可用性。 从消极的方面看,面向对象开发技术与r d b 技术配合得并不完美。这两种方法 的差异被称作对象关系阻抗不匹配,也称作o 瓜阻抗不匹配。为什么会出现这 种不匹配昵? 因为这两种技术底层的范型是不同的,因此它们不可能无缝集成。 当我们考虑首选的访问方法时,阻抗不匹配就变得很明显:使用对象范型我们 可以通过对象之间的引用关系遍历对象;而在关系范型中,就需要连接表中的 记录。这种差别造成了这两种主流技术的组合并不完美。这也就直接导致了对 象持久化很难成功。 第一章绪论 当前,通常有两种方法实现持久业务对象f ”,它们是: 1 硬编码法( h a r dc o d i n g ) 。业务对象通过数掘库递交结构化查询语言( s q l ) 来直接访问数据源。其优点在于可使程序员迅速编写代码,对于小型系统来说, 这是可行的方法。其缺点是:1 ) 程序员必须编写大量的s q l 代码,并进行测试 与维护;2 ) 使用关系数掘库模式直接祸合业务类,数据库中简单的改动需要重 新编写源代码、重新测试并重新编译和分发文件。 2 数据访问对象( d a t aa c c e s so b i e c t ) 。这种方法通过专用数据类封装业 务对象所需的数据库访问逻辑。通常,一个业务对象对应一个数据访问对象; 例如,a c c o u n t 类对应一个a c c o u n t d a t a 类属性,由它束实现相应的s q l 代码。 该方法较之直接法,其优点在于使业务类不再直接耦合到数据库上;但是其代 价是数据访问类进行了耦合,因此当数据库发生变化时,需要重新编写数据访 问类。程序员可自行编写d a 0 ,也可以遵循行业标准方法。 这些传统的数掘库操作方式在当今的系统丌发中遇到了越来越多的问题。 如上所迷,当更换数据库时,将给代码更新、系统维护带来极大困难;除此之 外,它使用的数掘类型为非面向对象型,查询的结果为数据库字段的简单集合。 这违背了面向对象设计的设计思想。 第二节国内外研究现状 为了解决这个问题,“对象关系映射”应运而生。它是指这样的一种操作: 将对象的状念映射到关系数据库的数掘上,以便提供透明的持久性。其核心思 想是:将关系数掘库中表的字段作为对象型数掘中的属性,将字段和属性一一 映射;同时将数掘库中表之间的关系映射为对象之f 日j 的关系。这种方法把应用 系统与数据存储分丌,有利于系统的管理和扩展,是一种可行的策略。 它的具体技术实现是“持久框架( p e r s i s t e n c e 矗锄e w o r k s ) ”。持久框架也 被称作持久层,它完全封装了业务对象的数据库访问,无须编写大量s q l 代码; 程序员所需要做的仅仅是定义映射的元数据,通过它,持久层生成所需要的数 据库访问代码,以持久化业务对象和它们之日j 的关系。这种方法的好处显而易 见:程序员不需要知道关系数掘库模式的知识,甚至不需要知道对象正在被存 储到关系数掘库中:通过管理工具就可以定义好对象模式和数据模式之间的映 射,因此不需要长时| b j 测试与维护;而且持久层的整体性能一般会比开发人员 2 第一章绪论 编写的s q l 代码要好,因为大多数的丌发人员并没有编写持久层的专家们所掌 握的技巧和技术。当然,这需要程序员投入一定的时间与精力来理解采用的持 久框架所提供的功能。 对象关系映射技术在解决对象存储和访问的问题提出了新的解决方案,成 为目前解决在关系数据库中访问对象的研究热点。国外已经有了一些产品与标 准出现,主要有: 1 微软在v s n e t2 0 0 5 中提供的o b j e c t s p a c e s ,它是在a d o 数据层之上的 一层0 瓜m a p p i n g 框架。 2 j c p 提出的j d o ( j a v ad a t ao b i e c t ) 标准。 3 , 些开源产品:n h i b e r n a t e ,i b a t i s 。 第三节论文的工作 本文对面向对象系统中类及其实例与关系数据库中表的映射( 即对象关系 映射) 这一问题进行探讨和研究。针对j a v a 具体平台,详细描述了对象属性、 对象关系、继承结构的映射策略,并根掘j a v a 平台对集合容器的标准实现 集合框架与j a v a 5 0 的新特性枚举提出了映射策略。并以此为基础给出了一 个持久框架系统设计,实现了映射处理、事务处理、系统优化等基本功能,并 根掘实际丌发需要给出了自动生成映射文件的模块。 第四节论文结构 全文共六章内容: 第一章绪论,说明本文的研究方向、目标等。 第二章介绍和对象关系映射相关的理论,包括对象理论、关系数据库理论 以及x m l 标准,为下文做铺挚作用。 第三章对对象关系映射理论的基本概念及难点问题进行描述。 第四、五章是本论文的重点。第四章针对j a v a 平台详细分析了从对象到关 系表存储的策略以及实现中应考虑的因素;第五章给出了一个持久框架的实现 设计,包括映射实现、事务与并发控制处理、缓存与代理等优化手段,并利用 j a v a 5 o 中的a 衄o t i a t i o n 类型提供了一个映射文件自动生成模块设计来提离开发 3 第一章绪论 效率。 第六章是本文的总结,说明本文的工作以及对以后的展望。 最后是参考文献和致谢。 4 第一章相笑背景知识的介绍 第二章相关背景知识的介绍 对象关系映射是为了融合面向对象技术和关系数据存储技术而发展出来的 一项新技术,其本质是数据在关系模型和对象模型之间的相互转换的过程。所 以本章将简要介绍面向对象技术和关系数据存储技术以及作为映射信息的载体 v f l 标准。 第一节对象技术 自从2 0 世纪6 0 年代面向对象技术出现,数十年束该技术在广度和深度上 不断发展、成熟。相对于以前的各种程序设计方法,面向对象技术能够更好地 适应当今软件开发在规模、复杂性、可靠性和质量、效率上的种种需求,已经 成为被广泛采用的行业标准。 面向对象技术是一种新的程序设计方法学,也是一种认知方法学。面向对 象程序设计方法是一种支持模块化设计和软件重用的实际可行的编程方法。面 向对象的程序就是相互联系( 或通信) 的对象集合。由于现实世界可以抽象为 对象和对象联系的集合,所以它的出现相对于传统的面向过程的程序设计方法 更好地适应当今软件丌发的需要。 面向对象数掘模型是用面向对象观点束描述现实世界实体( 对象) 的逻辑 组织、对象间限制、联系等的模型。一系列面向对象核心概念构成了对象模型 的基础。主要有以下几点1 2 i : 1 对象 对象是由一组数据结构和在这组数据结构上的操作的程序代码封装起来的 基本单位,是对某个事物的一个抽象描述。一个对象由以下几部分组成: 属性集合,描述对象的状态、组成和特性。 方法集合,描述对象的行为特征。 消息集合,对象向外提供的界面。 2 类 5 第一章相天背景知识的介绍 对象是类的一个实例或一次出现。类描述了相同特性( 属性) 、行为( 操作) 、 关系以及语义的一组对象。类不能是它们描述的对象本身,类是同一种对象的 集合的抽象,即同一类对象的变量和方法的原型。 3 抽象 面向对象技术采用抽象的方法来处理现实世界的复杂性。抽象是分析问题, 将应用所感兴趣的那些职责、属性和方法给抽象化,同时忽略其它部分。这包 含了两层含义:1 ) 将具体内容抽象化;2 ) 只关心需要的部分,忽略其它部分。 4 封装 封装将对象的外部因素( 具有外部访问性) 与内部实现细节( 对外部对象 不具有可见性) 分离开束。它将数据结构和行为组织在一个实体里,数据的表 示方式和对数掘的操作细节被隐藏起来,用户通过操作接口对数据进行操作。 这样的话,阻止了程序组成部分的过分依赖,因此我们可以以任何方式构建系 统,之后再改变实现的时候不再影响到系统内其他组件( 当然,组件的接口不 发生变化) 。封装与抽象密切相关。它们是互补的,好的抽象有利于封装,封装 的实体则帮助维护抽象的完整性。 5 多念性 面向对象系统的多念性是指不同的对象收到相同的消息时产生多种不同的 行为方式。多念的实现是由消息的接收者确定一个消息应如何解释,而不是由 消息的发送者确定,消息的发送者只需知道另外的实例可以执行一种特定操作 即可。 6 继承 两个或多个类之| 日j 经常会共享属性和或方法,即它们之间存在着相似性。 继承这样一种机制,它将多个类之1 日j 的相似性封装起来。有了继承,我们就很 容易复用已有的代码和数掘。 7 关系 对象与对象间是有关系的。可能存在的关系如下:关联、聚合、组合、依 赖。 关联关系是两个或多个类或对象之问的联系。关联具有方向性( 可以是单 向的,也可以是双向的) ;多重性。关联通过属性与方法的组合来实现。 聚合关系是关联关系的一种,是强的关联关系。聚合是整体和个体之间的 关系,表示对象由其他对象组成。 6 第二章相芙背景知识的介绍 组合关系也是关联关系的一种,是更强形式的聚合。它要求聚合关系中代 表整体的对象负责代表部分的对象的生命周期。在组合关系中,部分对象仅属 于一个整体对象,并且生命周期相同。 依赖也是对象间的一种关系,它是临时的关系,而上面提到的三种关系是 持久的。这是因为它表示了一个对象与另一个对象可能会发生的相互协作,而 关系某一端的对象是暂时对象( 协作完成,关系不再存在,暂时对象多半也被 销毁) 。 8 消息( m e s s a g e ) 由于对象是封装的,对象与外部的通信一般只能通过显式的消息传递,即 消息从外部传递给对象,存取和调用对象中的属性和方法,在内部执行所要求 的操作,操作的结果以消息的形式返回。 第二节关系数据库技术 数据库技术是应数据管理任务的需要而产生的。数据库的发展按其数据模 型可分为四个阶段:层次模型数据库、网状模型数掘库、关系模型数据库和面 向对象模型数据库。层次数掘库和网状数据库在2 0 世纪7 0 年代到8 0 年代初非 常流行,在数据库系统产品中占掘了主导地位,现在已经基本上被关系数掘库 系统取代,而面向对象模型数据库由于标准化和性能两方面的原因市场化程度 还不高。 与层次模型和网状模型相比,关系数据库所采用的关系模型有以下优点: 关系模型建立在严格的数学模型基础之上。 关系模型的概念单一。无论实体还是实体之l 日j 的联系都用关系表示,对数 据的检索结果也是关系。所以其数据结构简单、清晰,用户易懂易用。 关系模型的存取路径对用户透明,从而具有更高的数据独立性、更好的安 全保密性,也简化了软件系统丌发人员的工作。 关系数据模型的主要缺点是:由于存取路径对用户透明,查询效率不如层 次模型和网状模型。因此为了提高性能,必须对用户的查询进行优化,增加了 开发数据库系统的难度。 关系模型有三要素,分别为关系数据结构、关系操作集合和关系完整性约 束。下面分别进行介绍p j : 第二章相关背景知识的介绍 1 关系数据结构 关系模型是建立在严格的数学概念的基础上的。在关系模型中,实体与实 体间的联系均用单一的数据结构类型即关系( 表) 来表示的,而数据操作的结 果也是关系。在用户观点下,关系模型中数据的逻辑结构就是一张二维表,它 由行与列组成,表的每一行为一个元组,每一列为一个属性。从集合论的角度 来看,关系就是笛卡儿积的子集。关系可以有三种类型:基本表( 基表) 、查询 表和视图表。基本表是实际存在的表,它是实际存储数据的逻辑表示。查询表 是查询结果对应的表。视图表是由基本表或其它视图表导出的表,是虚表,不 对应实际存储的数据。关系模型要求关系必须是规范化的,即要求关系模式必 须满足一定的规范条件。这些条件中最基本的一条就是,关系的每一个分量必 须是一个不可分的数据项。 2 关系操作集合 关系操作的特点是集合操作方式,操作的对象和结果都是关系,即若干元 组的结合。关系数据模型的关系操作主要包括:查询、插入、删除和修改数据。 早期的关系操作能力通常用代数方式或逻辑方式束表示分别称为关系代数和关 系演算。关系代数是用对关系的运算来表达查询要求的方式。关系演算是用谓 词束表达查询要求的方式。另外还有一种介于关系代数和关系演算之间的语言 s q l ( s t m c t u r e dq u e r yl a l l g u a g e ) 。s q l 不仅具有丰富的查询功能,而且具有数 据定义和数掘控制的功能,是集查询、数掘定义、数掘揉作、数据控制为一体 的关系数掘语占。它充份体现了关系数掘语言的特点和优点,是关系数掘库的 标准语言。 3 关系完整性约束 关系模型中允许定义三种完整性约束:实体完整性、参照完整性和用户定 义完整性。其中实体完整性和参照完整性是关系模型必须满足的完整性约束条 件,被称作是关系的两个不变性,应该由关系系统自动支持。实体完整性规则 是指表中的任意行在主键所在的列的取值都不允许为空。保证了主键必须起到 唯一标识作用。参照完整性规则指参照关系中每个元组在外键上的值要么为空 值( 外键的每个属性值均为空值) 要么等于被参照关系中某个元组的主键值。 保证了表之间的联系。用户定义完整性是针对某一具体关系数掘库的约束条件, 体现了具体应用中的语义约束要求。 由关系完整性约束可以得到关系规则,这些规则告诉我们关系模型的表结 8 第一章相戈背景知识的介绍 构中哪些变化是允许的,哪些检索操作是受限的。关系规则反映了数据模型的 特点、约定的数学假设,对关系结构的良好性状有重大意义。通过保证关系规 则,使数据正确、一致。 第三节扩展标记语言( x m l ) x m l ( e x t e n s i b l em a r k u pl a l l g u a g e ) 是s g m l ( s t a n d a r dg e n e r a l i z e dm a r k u p l a i l g i l a g e ,标准通用建模语言) 的一个子集。这些重要的标准在w 3 c ( w o d dw i d e w 曲c o i l s o n i u m ) 网站( h n p :u n ,w w 3 c o r g ) 上都有详细描述。w 3 c 的x m l 工作组是这样描述x m l 的:“x m l 是s g m l 的子集,其目标是允许普通的s g m l 在w e b 上以目前h t m l 的方式被服务、接收和处理。l 被设计成易于实现, 且可以在s g m l 和h 州l 之问互相操作。”【4 l x m l 是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些 部件加以标识,其本质是分层表示文本数据和定义元数据的一种标准化方法。 从程序员的角度来看,x m l 是一种由元数据支持的数据表示,还有一系列的解 析其数据的标准化技术。数据存储在x m l 文档结构罩,元数掘用d t d ( d o c u m e m 聊ed e f i n i t i o n ) 或x m ls c h e m a 定义保存。 x m l 有以下主要特点: 1 规范简单。x m l 经过精心设计,整个规范简单明了,它由若干规则组成, 这些规则可用于创建标记语言。 2 标准丌放。x m l 是s g m l 在市场上的许多成熟的标准之一。已经存在 各个平台的x m l 解释器,可以使用它们柬载入一个x m l 的文档,当这个文档 被载入以后,用户就可以通过x m l 文件对象模型束获取和操纵整个文档的信息。 3 良好的延展性与沟通性。x m l 并没有固定的标记,可利用d 1 d 的定义 来声明文件中的标记、属性和元素。比如一个x m l 组件可以宣告与其相关的资 料为颜色、尺寸、条形码、数量或其它任何数据元素。通过使用d t d ,不同的 组中的人能够使用具有相同d t d 的x m l 文件束交换数据。 4 国际化。它具有统一代码的编码标准u n i c o d e ,这种编码标准是一种 足够大的字符集合,以致于囊括了世界上所有仍在使用的语言及一些已经不再 使用的语言。能阅读x m l 语言的软件就能顺利处理这些不同语言字符的任意组 合。因此,x m l 不仅能在不同的计算机系统之间交换信息,而且能跨国界和超 9 第一章相芙背景知识的介绍 越不同文化疆界交换信息。 因为这些优点,当应用系统跨越多个物理服务器时,常常会用) a l 来在应 用系统中传递数据;把x m l 作为配置文件的做法也很常见。因此在我们的对象 关系映射中,我们就使用x m l 来作为映射信息的载体。 1 0 第二章对象芙系映射 第三章对象关系映射 第一节对象关系映射基本概念 3 1 1 对象关系映射必要性 一方面,面向对象技术是软件丌发的主导的技术。另一方面,关系数据库 仍然是许多人都青睐的持久信息存储方法。对象模型基于软件工程的一些原理, 例如抽象、封装、继承、聚合和多态,而关系数据模型则基于数学原理,特别 是集合论的原理。两种不同的理论基础导致各自有不同的优缺点。对象模型侧 重于从包含数掘和行为的对象中构建应用程序,而关系数据模型则主要针对数 据的存储。对象模型和关系模型之间的这种差别称为“阻抗不匹配”。当为数据 访问寻找一种合适的方法时,“阻抗不匹配”就成了主要矛盾:使用对象模型, 是通过它们的关系来访问对象:而使用关系数据模型,则通过冗余数据来联接 表中的行。由于面向对象的模型和关系数据模型的“阻抗不匹配”,当应用系统 中的对象需要存储在关系数掘库中时,需要进行对象关系的映射。对象关系的 映射( o b j e c t 瓜e l a t i o nm a p p i n g ) 是指这样的一种操作:它将对象的状态映射到 关系数掘库的数据上,以便提供透明的持久性。 关系型数据库设计通常参照三级数据库模式结构。 最接近物理数据库的内部模式也称存储模式,它是数据物理结构和存储方 式的描述,是数据在数掘库内部的表示方式,一个数掘库只有一个内部模式, 由d b m s 提供的内模式描述语言来严格地定义。 处于数掘库模式结构中间层的是模式,也称逻辑模式。逻辑模式是数据库 中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。逻辑模式 既不涉及数掘的物理存储细节和硬件环境,也与具体的应用程序,与所使用的 应用开发工具就程序设计语言无关。 外部模式是从特定用户应用角度看待的数据库模式,它是数据库用户能够 看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图, 第三章对象关系映射 从不同的应用出发对同一逻辑模式可以给出多种不同的外部模式f 3 1 。 当外部应用系统以对象模型进行抽象时,从各个应用出发抽象出的对象模 型可以映射到关系型数掘库的外部模式上,对此可称之为外部对象模型。但是, 外部模式只是逻辑模式的子集,所以面向对象的关系数掘库设计核心在于系统 对象模型( 不妨称之为概念对象模型) 向数据库逻辑模式的映射,即对象关系 的映射。而对象关系映射同时也是一个采用关系数掘库的面向对象软件系统成 功的决定性因素之一。 对象关系映射解决方案一般把每个对象映射到数据库表的单个行上,这一 行通常来自一个表,但有时由一个表的连接操作产生。如果i u ) b m s 支持可更 新视图,也可以使用一个视图柬简化映射。一般束况,对象关系映射解决方案 应该使得映射不用自定义代码就能进行,从而向编程人员隐藏数据存储细节。 映射通常被保存在那些已映射类外部的元数掘中。 对象关系映射的重要作用是它消除了开发人员编写低级数据访问代码的需 要,这在某些应用中能够极大地提高工作效率,从而保证应用代码专心地处理 对象,以及能够导致创建一个可以支持多个用例的域对象模型【引。 3 1 2 对象关系映射的缺点 对象关系映射既有优点,也有缺点。在某些应用中对象关系映射可能对降 低总复杂性的作用不大,而且对象关系映射本身也带来了新的复杂性。 在对象驱动建模的情况中,它会导致一个不自然的r d b m s 模式,这样限 制了性能。一个不自然的r d b m s 模式包括常见数掘操作中需要复杂的连接, r d b m s 不能实施参照完整性,以及在一个较好的模式已经允许使用一个集合操 作的地方却需要发布许多个别更新。 在数据库驱动建模的情况中,通过r d b m s 模式来产生一系列的对象,这 些对象与r d b m s 中的表有着一对一的关系。但这些对象通常并不是真正的对 象应该有的表现形式,所以处理它们可能是不自然的和低效率的。如果r d b m s 模式发生变化,处理这些对象的所有代码也将需要变化。 另外,对象关系映射的效率也是一个问题。通过映射,无疑增加了系统的 工作,使得效率降低。这通常通过数据高速缓存和提供优秀的数据查询手段来 进行弥补。 1 2 第二章对象关系映射 因此对象关系映射并不总是使用关系数掘库的面向对象软件应用的绝对最 佳解决方案。它在某些情况中工作得很好,但有时则是另外一种情况。 第二节难点问题 简单的来说,在对象与关系数据库表的行之| 日j 有着简单的对应关系。对象 是类的实例,运行时包含了某些数据;类似的,关系数据库的表结构由列所组 成,每一行就是一组不同的数据。也就是说,类的实例( 对象) 与数据的行( 元 组) 以相同的方式包含着数据。 然而,面向对象设计的目标是通过把一个业务过程分解成具有标识、状态 和行为的对象束建模的一个业务过程;而关系数据库不支持诸如类、继承性、 多态性这样的对象概念。由于面向对象的模型和关系数据模型之间这种差异而 造成的对象关系映射的难题被称为“对象关系阻抗不匹配”( 0 b j e c t r e l a t i o n a l i m p e d a l l c em i s m a t c h ) 。其中存在的问题是如何用关系数据库的表表示对象的各 种属性与联系【5 l 【6 】: 对象的唯性 对象模型中的对象都有自己的唯一的对象标识符( ob i e c ti d e n t i f i e r s ) 以区 别于其它对象。在j a v a 环境中,j a v a 虚拟机中的j a v a 对象是通过该对象在内存 中所占空甸的地址来区别于其它对象。两个对象可以拥有相同的状态,但它们 必须具有不同的对象标识符。同样的,关系数掘库中的行之间也要相互区分, 而这种区分是通过每个数据库表中的行必须具有的唯一不重复且不为空的主键 值来进行的。因此我们需要确定如何在关系数据库中表示对象的唯一性,即如 何在数据库表的主键与对象标识符之i 日j 建立映射。 对象的属性 对象是有状态的实体,当我们用关系数掘库来保存对象的状态时需要将对 象的状态( 也就是各种数据) 存储于映射的数掘库表中。这存在着许多问题, 比如j a v a 中的基本数据类型:i m 、n o a t ,都不能直接映射到确切的s q l 类型。 即使是j a v a 中的简单数掘类型。如s t r i n g 和d a t e ,也在关系数据库中无确切的 等价类型,因为在j a v a 中这些是类,而按照对象关系映射的基本原则,对象应 该映射到表。而对于对象的存储,问题就要复杂的多,因为关系数据库数据类 型简单、固定,它只能理解、存储处理简单数掘类型( 数字、串、日期、布尔、 1 3 第二章对象芙系映射 货币等类型) 。面向对象方法可方便的构造各种新类型,而关系数据库不提供增 加用户定义数据类型的手段。 对象的方法 对象是数据和行为的综合体,对象中的行为总是与对象的属性关联的。而 关系数据库中的操作如存储过程并未与特定的数据即对象表示相关联,即关系 数据库不支持对象两要素数掘和操作的封装,存储过程不能自动被应用。所以 虽然对象中的数据可以被存储于数据库中,而对象中的方法是很难存储于数据 库中的。 对象的继承 对象模型中对象间有继承关系,而关系数掘库无法直接支持对象间的继承 关系,所以当在关系数掘库中表示继承层次关系时,会存在如何为已映射到关 系数掘库上的对象中的继承性建立模型的问题。 对象问的关系 在对象模型中对象问存在着复杂的关系,这些关系包括关联、聚合、组合。 对象总是通过跟踪另一个对象的引用被“发现”。而在关系数据库中,这有不同 的概念:表由行组成,操作是在行上进行,用户需要用多个元组表达关系。因 此,对象模型可以简单处理的这些关系要移植到关系数掘库中会带来了极大的 复杂性。 1 4 第四章对象戈系映射实现策略 第四章对象关系映射实现策略 第一节映射对象属性 类属性将映射成关系数据库中的零或几列。需要注意的是,并不是所有类 属性都是需要持久化的,即并非所有的属性都需要映射成列。例如,s t u d e m ( 学 生) 类可能会有a v e m g e m a r k ( 平均分) 属性,这个属性由其学生对象实例在计 算时使用,但它并不需要保存到数据库中,所以无需对其进行映射。 将属性映射成列时通常的情况是一个类属性映射到一个表的列。当类属性 和表的列是相同简单类型时( 例如当它们都是同期型或字符串型时) 直接进行 一对一的映射就可以。但是当需要映射的类属性类型不是简单类型或者是关系 数据库不支持的类型时,问题就会比较复杂。例如,大多数关系数据库并不支 持类属性中常见的b 0 0 1 e a l l 类型,这时就要将其映射成字符型或数值型的列。而 且,某些类属性本身就是对象,例如p e r s o n ( 人) 对象有一个作为属性的 a d d r e s s b o o k ( 通讯录) 实例,它可以映射为数掘库中的几列。实际上,很有可 能a d d r e s s b 0 0 k 类本身就将映射成一个或多个表,在这种情况下这两个对象间 存在关联关系,所以要对关联关系进行映射,这将在4 3 节中进行论述。需要注 意的是:有时属性将映射成零列或者多列,也有可能将几个属性映射成表中的 单一列。例如,代表电话号码的类可以有三个数字属性:国家号、地区号、电 话号,而电话号码可以在表中作为单一的列存储。 第二节映射“影子信息” 影子信息( s h a d o wi n f o r n l a t i o n ) i 刀是除了普通领域数据外,对象需要维护的 任何用于将它们自己持久化的数据。这一般会包括主键信息( 对象标识符) , 特别是我们一般需要主键是没有业务含义的代理键( s u n d g a _ t ek e y ) 时,另外还 有并发控制标记( c o n c u n n c yc o n t r o lm a r k i n g s ) ,如时间戳( t i m e s 唧) 或增 量计数器( i n c r e i n e m a lc o 岫t e r ) 。例如,在图4 1 中,a d d r e s s a d d r e s s o i d 、 1 5 第四章对象芙系映射实现策略 a d d r e s s u p d a t e c o u m e r 、a d d r e s s da _ t e c r e a t e d 列都没有映射到类a d d r e s s 上。这 是因为a d d r e s s a d d r e s s o i d 是个代理键( 对象标识符) ,a d d r e s s u p d a t e c o i l l l t c r 用来支持乐观锁定的并发控制机制,而a d d r e s s d a t e c r e a t e d 是用来记录本行第 一次被写进表中的时间。尽管它们三列都与业务对象a d d r e s s 的业务无关,但是 由于它们的重要性,还是需要被映射。 a d d r e s ss t a t e r a b l 劳 a d d r c s s o i d :i n t e g e r s 诅t e c o d e :c h a “5 ) s t r e e t :c h a r ( 3 0 )n a m e :c h a r ( 3 0 ) c 斜:c h a “3 0 )c a p i t a l :c h a r ( 3 0 ) s t a t e c o d e c h a “5 ) u p d a t e c o u n t e r :i n t e g e r z i p c o d e i n t e g e rd a t e c r e a t c d :d a t e t i m e s t a m p u p d a t e c o u n t e r :i n t e g e r d 砒e c r e a t c d :d a t e t i m e s t a m d 幽4 1 映射影子信息 第三节映射关联 我们知道,在对象模式中,对象日j 的关系是通过对象引用和操作的组合来 实现的;而在关系数据库中,关系是通过外键束维护。外键是在单张表中出现 的数据属性,同时也是另外一张表中键的一部分,并与其相一致。 在对象模型中类之间存在多种关联,这些关联包括1 6 j l7 j : 一对一的关联( 如h u s b a n d w i f e ) 一对多的关联( 如m o t h e r c h i l d ) 1 6 第四章对象关系映射实现策略 多对多的关联( 如a 1 1 c e s t o r o f f s p r i n g ) p r e r e q u l s l 馆 图4 2 映射笑系 第四章对象- 关系映射实现策略 4 3 1 一对一关联 映射一对一关联,可以有两种策略。 1 如果每个类都有一张表对应,那么这两张表便需要使用一个外键来关联。 如i 蜀中的c o u r 卵和c o u r s e v i d e o 类,在两张表中实现一个外键。 2 在一张表中存储两个类的数据。如图4 2 中的c o i l r s e 和c o u r s e o v e n r i e w 类。 4 3 2 一对多关联 在对象模型中,我们在关系多的那方面使用集合容器,在一的这一面使用 对象引用;在数据库中,我们在关系多的一方面使用外键。如图4 2 中的c 0 1 | r s e 类与s e m i n a r 类是一对多的关系。在表中表现为定义c o u r s e c o l l r s e o i d 为 s e m i n a r c o u r s e o i d 的外键束映射s e c t i o no f 关系。 4 3 3 多对多关联 两个类之间的多对多关系被映射成数据库内的关联表。这张表包含了这两 个类所对应的两张业务表的主键。通过这样的关联表,我们把多对多关联转化 为两个一对多关联,从而降低了关联的复杂度。如图4 | 2 中的t e a c h e r 类和s e m i n a r 类的i n s 劬c t 关系被映射成i n s t n l c t s 表。 4 3 4 组合 关联的出现方式有两种:聚合( a g g r e g a t i o n ) 和组合( c o m p o s i t i o n ) 。聚合 意味着关联一端的对象知道另一端的对象,它们的生命周期不要求相同。组合 是更强形式的聚合,在组合关系中关联两端的对象具有相同的生命周期。当关 联以组合形式存在时,对象之间存在生命周期相同的约束( 在数据库中相应地 应该表现为当a 表被删除时,b 表同时要被删除) 。在这里我们可以通过触发器 来将关联的组合约束映射到数掘库中。在a 、b 和a s s o c i a t i o n ( 维护关联的a s s o c i a t i v e t a b i e ) 三个表上建立一个触发器完成如下功能:当删除a 对象时首先通过 a s s o c i a t i o n 表找到并删除a 所包含的对象,然后删除a s s o c i a t i o n 表中和a 有关的记 录。 1 8 第四章对象戈系映射实现策略 c r e a t et i u g g e rc o m p o s i t l 0 nm a p p i n g a f t e rd e l e t eo n a b e g n qa t o m l c d e l e t ef r o mb w h e r e i d 玎q ( s e l e c tbi d 舶ma s s o c i a t i o n w h e i 乇ea s s o c i a t i o n ai d = a ) 1 d e l e t ef r o ma s s o c i a t i o n w h e r ea s s o c i a t i o n ai d = a i d e n d 第四节映射继承结构 关系数据库没有支持继承,这就迫使我们把对象模式中的继承结构映射到 数掘模式上去。 4 4 1 单一继承 将继承模式映射进关系数据库中,主要有以下三种方法: 把整个类层次映射到单张表中去( s i n 9 1 et a b l e ) ; 把每个具体类映射成自己的表( o n et a b l ep e rc o n c r e t ec l a s s ) ; 把每个类映射成自己的表( o n et a b l ep e rc l a s s ) ; 图4 3 给出了一个简单的类层次以及它被映射到关系数据库的三种方式。第 一种方法( s i n g i et a b l e ) 在p

温馨提示

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

评论

0/150

提交评论