(应用数学专业论文)基于net的or+mapper的设计与实现.pdf_第1页
(应用数学专业论文)基于net的or+mapper的设计与实现.pdf_第2页
(应用数学专业论文)基于net的or+mapper的设计与实现.pdf_第3页
(应用数学专业论文)基于net的or+mapper的设计与实现.pdf_第4页
(应用数学专业论文)基于net的or+mapper的设计与实现.pdf_第5页
已阅读5页,还剩89页未读 继续免费阅读

(应用数学专业论文)基于net的or+mapper的设计与实现.pdf.pdf 免费下载

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

文档简介

摘要 基于n e t 的0 瓜m a p p e r 的设计与实现 专业:应用数学 硕士生:汤庆恩 指导老师:伍小明 摘要 近年来大型软件系统大多采用面向对象的分析、设计方法和使用多层式的结 构形式组织。由于目前关系数据库已经广泛流行,而面向对象数据库技术尚未成 熟,因而绝大多数系统都采用关系数据库而不是使用面向对象数据库。因此怎么 把对象映射到关系表一直是一个难题。本文的工作是在n e t 平台上设计和实现 了把对象映射到关系表的工具,即o 瓜m 叩p c r 。 本文首先简要讨论了大型软件系统的三层式分层模式,然后着重讨论了如何 利用领域模型的模式来组织领域逻辑。由此出发,讨论了领域模型映射到数据源 层的方法,也就是o b j e c t r e l a 廿o n a lm 印p i n g 方法。接着详细描述了在n e t 平 台下构建0 恨m 印p 盯的过程。此。瓜m a p p c r 基本实现了把对象保存到关系数据 库的功能。能自动根据类来生成关系表结构,可以处理一般的n e t 对象的增加, 删除以及修改功能。它能够支持市面上大部分数据库,包括s q ls e r v e r ,0 r a c l e 等。它使用了数据集缓存对象数据,支持断开式更新;支持动态建立关系表;支 持分布式系统;无需用户自己建立映射文件而可以支持动态映射。但是该0 瓜 m a p p e r 对数据库会话的管理还有待改进,对事务的支持也需要更加细致。 关键字:对象关系映射,0 rm a p p e r ,n e t ,关系数据库管理系统,三层 式系统 a b s t r t t h e d e s i g na n di m p l e m e n to fo ,rm a p p e rb a s e do n n e t m a j o r :a p p l i e dm a t h e m a t i c s n a m e :1 a n gq i n ge n s u p e r v i s o r : w ux i a om i n g a b s t r a c t m o s tl a r g es o f t w a r e sa r ed c v e l o p c da so b j e c to r i e n t e d 趾dm u l t i - l a y e r ss y s t e m s n o 、a d a y s s i n c er e l a t i 伽m 【) a 诅b a c o n c e p ta n di t sp r o d u c t sa r ew e l la c c e p t e d ,觚d t e c h n o l o g yo fo o d bi s n tm 咖r e ,i ti ss t i ua d o p t e df b n q u e n t l ymm 姐yp m j c c t s r a t l l e rt h a no b j e c t - 嘶e m e dd a t a b 髂e h o w e v e r ,m e r ea r ep r o b l e m sl i ei nt h a lo b j e c t p a t t e m sd o n m 胁ht h e 咒l a t i o n a lp g c t e mw c l l 锄dh o wt om a po b j e c t si n t or e l a t i o l l a l 臼l b l e si sad i m c 咄q u e s t i o n t 1 l i sp a p e r h 邪p u to 瓜m 印p e r b a s e do n n e ti n t oe 腩c t a l l dt l l ea u t i l o rh 勰s u c c e s s 矗山yd e s i g n e da n di n 巾l e m e m e dt h es y s t e mt op u to b j e c t s 也趾s f c r e di n t ot l l ei e l 砒i o n a lt a b l e s 1 h sp 印e ri r n r d d u c e dt l l l e c - l a y e rd e s i 驴p a 仕e ma t 触w i 也t l l i sc o n c e 此也e a u t h o ru dd o m a i nm o d e lp a t t e mt oo r g a l l i z ed o m a i nl o g i c a f t e rt h ei d e ac 锄eo 此 t i l em e l o d 廿l 锄s f i 船d o n l a i nl o g i ct om ed a t al a y c r 、) l “c hi sc a l l e do b j e c t r _ e l 撕o n a lm a p p i n gi su 辩d 洫t l l i sp a p e r b a 辩do n n e tf r 锄e w o r k ,t h cw o r kt o b u i l d 由妇m 印p i n gl a y e ra r eg i v e ni i ld 砌l si nt l l i sp a p e r i na l l ,t h cs y s t e mc 锄 r c a l i 黯t l l e 如n c t i o n st o 位m s f e ro b j e c t sd a t at od a t a _ b 嬲e ,t ob u i l ds 劬j c t l l r co ft a 【b l e s a u t o m a t l ya c c o r d i i l gt 0t l l ec l a s s e sc r e a t e db yu s e r s 趾dd e a l 诵也f i l n c t i o n st o 证r t , d e l e t ea n du p d a t eo 巧e c 招c r c a t e do n n e tf 舢l e w o r k o 瓜m a p p e f 啪s u p p o f tm o s t d a b a b 嬲es y t e m sb e s i d c ss q ls e r v e r o r l ea n ds oo n i nm yo 瓜m 印p e rs y t e m , t l l e r e sab u t f e rm a ts a v e so b j e c td a 乜a n d 也es y s t e m c 姐u p d a t ew :h i l e d i s c o 聃e c t i o n i k l a t e dt a b l e sa r eb u i l td y m m i c t l yi ni t 锄di ti sar e a ld i s t r i b u t c d n e t w o r ks y s t e m d y n 啪i cm a p p i i l gf h n c t i o ni sp r o v i d e d 砸t 圭1 0 u tu s e r s p r o f i l e s i nt l l e f u t i l r e ,t h e 出曲b 鹪es e s s i o nm a l l a g e m e n to f0 ,rm a p p e rn e e d st ob ei i i l p r o v e da n d m ys y s t e mw i l lh a v eab e t t c rs u p p o r t 谢t l lt r a n s a c t i o nm a l l a g e m e me i m c r k e y w o r d :o b j e c t - r e l a t i o n a lm a p p i i l g ,0 瓜m 印p e r ,n e t ,i t d b m s n 嘴e l a y e rs 1 l c t u r e i i 第l 章综述 第1 章综述 现代大型的软件系统的结构形式已从两层式的客户服务器系统过渡到三层 式的表现层一领域层一数据源层系统。三层式系统通常使用面向对象方法来组织 复杂领域逻辑。使用面向对象的方法可以更好迨操纵领域逻辑,并且能保持系统 的扩展性。 软件系统通常需要保存信息到数据库。对于使用面向对象方法的系统,则需 要保存对象到数据库,也需要从数据库取出数据并能还原成对象。使用关系数据 库的软件系统会面临把对象映射到关系数据库的问题。这个问题称为 0 b j e c t r a t i o n a lm a p p i n g 问题,简称o rm a p p i n g 。 本文的工作是在n e t 平台上构造一个解决上述问题的o rm a p p e r 工具。0 r m a p p e r 可以把类映射到关系数据表,并可以透明地保存和读取对象。在这个过 程中用户j 无需编写任何数据库访问代码。 1 1 应用软件的结构形式 1 1 1 客户服务器的两层式系统 客户服务器的两层式系统分为两个部分:客户端程序和数据库服务器程序。 这两个部分通常会部署在不同的机器上。 ( 1 ) 数据库服务器 数据库服务器通常是一个关系数据库服务器,它为多个客户端程序提供服 务。 当客户发出数据请求时,服务器分析这些请求并返回相应的数据。在早期, 这些请求都是基于连接的。在客户端程序运行的整个期间,服务器都必须维持客 户机到服务器的连接,并为连接保留缓存等资源。这种方式会比较浪费资源。 在后期,许多数据提供程序开发商所提供的数据库连接程序都加入了非连接 式的数据缓冲机制。它允许客户端利用数据库连接获取一定数量的数据之后,就 断开连接,并把获得的数据放入一个可维护的缓存中,客户可在缓存中编辑数据。 第1 章综述 这样客户端就不会占用服务器的资源。在适当时候客户可以把修改完的数据上传 到数据库,完成更新。缺点是对于并发更新控制比较麻烦。 ( 2 ) 客户端程序 在两层式系统中,客户端程序主要有两个功能:1 负责业务逻辑的处理。2 把业务处理的结果以不同的形式向用户显示。 常见的客户端开发工具如v b 、p o w e r b u i l d e r 和d e l p h i 。这些工具适合数据 密集型的应用程序。它们的开发环境控件通常都是s q l 感知的。开发者在设计期 间就可以使用数据库来测试自己的应用程序。 这种客户服务器系统的工作方式比较适合关系数据的简单显示和修改。问 题来自于领域逻辑:如业务规则、验证、计算等等。很多开发人员把领域逻辑直 接嵌入到用户界面当中。当领域逻辑发生变化时,开发人员必须在许多界面代码 中间把它们找出来并逐一地修改它们。一般情况下这些逻辑代码会有很多拷贝, 开发人员如果忘记修改其中一份,就有可能造成逻辑错误甚至程序崩溃。 另一种选择是把这些领域逻辑以存储过程的形式放到数据库端。但是存储过 程只提供有限的结构化机制,并且数据库厂商提供的存储过程机制一般都是互不 兼容的,造成开发人员很难移植存储过程。 综上所述,两层式系统不适合有复杂领域逻辑的软件系统,解决这个问题的 方案是三层式系统。 1 1 2 三层式系统 三层系统有三个基本层次:表现层、领域层和数据源层。下表总结了这些层 次的主要功能: 层次功能 表现层 提供显示服务( 例如在w i n d o w s 或h t m l 页面中) ,处 理用户请求( 鼠标点击,键盘敲击) ,h t t p 请求、命令行 调用,批处理a p i 领域层处理业务逻辑,系统中真正的核心 数据源层与数据库、消息系统、事务管理器及其它软件包通信 表l 一1 三个层次的功能m 2 第1 章综述 表现层处理用户与软件间的交互。主要功能是向用户显示信息并把从用户那 里获取的信息解释成领域层或数据源层上的信息格式。这一层次可以是命令行或 者是w i n d o w s 界面等。 领域层处理领域逻辑。它处理应用程序的所有领域相关工作:包括根据输入 数据或已有数据进行计算,对从表现层输入的数据进行验证,以及根据从表现层 接收的命令来确定应该调度哪些数据源逻辑等等。 数据源层主要关注与其它系统的交互。这些系统将帮助应用程序完成相关的 任务。它们可以是事务监控器、其它应用、消息系统等等。对于大多数企业应用 程序来说,最主要的数据源逻辑就是数据库,它的主要功能是储存数据。 领域层是三层式系统与两层式系统的根本不同之处。两层式系统把业务逻辑 组织在客户端程序中,从三层式的观点来看,把业务逻辑绑定在表现层会对系统 的扩展性产生不良的影响。三层式系统对此的改进就是把业务逻辑单独地抽取出 来,独立成为一个层次领域层。这样,表现层和领域层可以相互独立,它们 可以各自变化。例如,如果需要一个新的界面,那么就重写表现层;业务逻辑有 变化,就修改领域层。 三层式结构并不是一种绝对的结构。它只是提供了一种指导的思想。开发者 在实际开发中,还可以针对不同闯题领域在这三层中再细分层次。例如可以在领 域层中再划分为三个层次。这三个层次分别是:控制中介层,领域层,数据映 射层。控制中介层用于控制表现层的逻辑行为;领域层则集中处理业务逻辑; 数据映射层负责领域层与数据源层之间的映射工作。这样的分层结构将使各层次 的功能更加明确。 1 1 3 组织领域逻辑 在三层系统结构中,领域层负责处理领域逻辑。领域逻辑的组织有三种主要 的模式:事务脚本、领域模型以及表模块“。 ( 1 ) 事务脚本 事务脚本是这样一个过程:从表现层获得输入,进行校验和计算处理,将数 据存储在数据库中,以及调用其他系统的操作等。另一方面,该过程将用户所需 第1 章综述 的数据从数据库读取出来并返回表现层,中间可能要进行大量的计算来组织和整 理返回值。 它的基本的组织方式是让每个过程对应用户做的每一个动作。所以,可以将 这一模式看成一个动作或业务事务的脚本。该脚本不必一定是单个的内嵌过程, 还可以分离成不同的子例程,这些子例程可以在不同的事务脚本之间共享。但是, 每一个动作还是由一个过程来驱动。例如,一个零售系统可能会有结帐,将商品 放到购物车,显示交货状态以及其他一些事务脚本。 事务脚本具有如下几个优点: 它是一个大多数开发者都能理解的简单过程模型。 它能够与一个使用行数据入口或表数据入口的简单数据源层很好地 协作。行数据入口是指在一个数据源中充当到一条记录的入口的对象。每 条记录对应一个对象实例。表数据入口是指充当到数据库表的入口的对 象。一个实例处理表中的所有行。 设定事务边界的方法显而易见:一个事务脚本始于其脚本的打开,终 于其脚本的关闭。很容易使用工具在后台设定事务边界。 但是,当领域逻辑的复杂性增加时使用事务脚本就会出现许多缺点。当若干 个事务需要做相似的动作时,通常会使多个脚本中包含某些相同的代码。通过将 这些代码提取出来组织成公共的子例程可以部分消除这种情况,但消除相似代码 仍然比较麻烦,而检测相似代码则更为困难。这些相似代码使得应用程序结构会 非常混乱。 ( 2 ) 领域模型 解决复杂逻辑问题的面向对象方法是使用领域模型。领域模型是合并了行为 和数据的领域的对象模型。 在领域模型中,不再是由一个过程来控制用户某一动作的逻辑,而是由每一 个类都承担一部分的相关逻辑。这种模型的价值在于可以使用许多面向对象模式 来组织复杂多变的领域逻辑。例如,在租赁系统中要增加新的收入确认算法时, 只需增加相应的新的策略类即可。而如果是使用事务脚本则需要在脚本的判断逻 辑中增加许多新的条件。 把领域逻辑按照一定的逻辑结构组织起来是领域模型最大的优点,并且这种 4 第l 章综述 结构是可扩展的。领域模型模式把问题域分割为一个个独立的类,这些类通过协 作来完成一定的逻辑。每个类都包含有特定的功能和一定的逻辑决策,替换这些 类就能更改逻辑决策甚至改变逻辑流程。 现代企业软件庞大而复杂,业务逻辑更是错综复杂。一条业务规则的改变就 有可能影响整个系统的运作。使用领域模型可以有效地把业务规则封装在对象 中。这些代表业务规则的对象在特定的情况下还可以进行重用,减轻开发者的负 担,也使系统具有致性。 最后,面向对象开发技术的发展也大大增加了领域模型的价值。许多设计模 式的研究为开发者提供了指导,帮助他们如何更好的封装业务逻辑,并能保持系 统的可扩展性。这能从具体实现上加强领域模型的可重用性和扩展性。 领域模型的问题在于使用上的复杂性和映射到数据源层的复杂性。这是面向 对象理论和关系理论的一个不匹配问题。对象理论基于面向对象软件工程原理, 例如继承、多态性、聚合和封装等等。而关系理论则基于数学原理,特别是集合 论的原理。两种不同的理论基础导致各自有不同的优缺点。 类对象是以层次结构描述的,采取对象之中包含子对象的形式来组织。但关 系数据库的数据表现力并没有面向对象系统那么丰富。最明显的一点就是关系数 据库不支持多值属性和复合属性。还有一点不同的是,在面向对象中,父对象持 有子对象的引用,而子对象没有父对象的引用。而关系数据库中要实现类似的关 联,要通过使用外键来维护。这时子表需要存储主表记录的标识值,这是典型的 主从表结构。 因此,使用领域模型来组织业务逻辑有很多的优点,但把领域模型映射到关 系数据库是一个难题。运用领域模型越充分,将它映射到关系数据库时就越复杂。 只有解决了这个难题,才能发挥领域模型的最大优势。 ( 3 ) 表模块 表模块是处理某一数据库表或视图中所有行的业务逻辑的一个实例“1 。它围 绕表而非直接围绕过程来组织领域逻辑,提供了更多结构,更容易发现和消除冗 余代码。但是,这个模式无法应用许多在领域模型中可以使用的组织逻辑结构的 技术,例如继承、策略和其他面向对象的设计模式”1 。 表模式的工作方式类似于领域模型。主要的区别在于领域模型处理逻辑时都 第1 章综述 会建立相应类的一个实例,而表模块则是针对该类只有一个公共的实例,用于管 理该类对象的集合。 表模块最大的优点在于其与软件架构中已有部分的衔接。许多g u i 环境在设 计时都假定将与s o l 查询的返回结果协同工作,这些结果一般是以记录集的形式 组织的。表模块也工作在记录集之上,因此可以很容易对数据库进行一次查询, 然后在表模块内对返回结果进行操作,再把操作完成后的数据传给g u i 显示。也 可以在将用户界面中修改的数据回传到数据库之前,使用表模块来完成计算和校 验。 使用表模块很大程度上依赖于开发环境的支持。以微软的n e t 平台为例, 它的a d o n e t 类库提供了相当多和十分成熟的技术来操纵数据集。在这种开发环 境下,使用表模块将能极大地提高工作效率。并且很多的开发环境具有数据敏感 控件与数据集组件配合,可以即时显示以及编辑数据库数据。在这种情况下,使 用表模块是非常适合的。不过,正如上面所述,表模块很难应用一些面向对象的 模式。所以,表模块也许能带来最高的开发效率,但是也可能在领域逻辑变化比 较频繁的开发后期出现维护困难的问题。 1 1 4 选择组织模式 在组织领域逻辑时具体使用哪种组织模式取决领域逻辑的复杂性和开发环 境的支持。 简单的领域逻辑应该使用事务脚本,它的优点是比较适合快速开发。但在逻 辑变得比较复杂的时候,就应该考虑过渡到领域模型或者表模块了。 如果领域逻辑比较复杂,就有两种选择,一种是领域模型,一种是表模块。 对于快速开发来说,应该使用表模块。许多开发工具提供了开发此类程序的方便 途径,而且表模块的组织形式和关系数据库非常相似,设计界面上也提供了许多 适合表模块的数据敏感控件。 但是,表模块并没有提供完全的面向对象能力来组织复杂的领域逻辑。不能 在表模块实例之间直接建立关联,而且多态机制也无法正常工作。因此,当处理 复杂逻辑时,领域模型将是一个更好的选择。 6 第l 章综述 领域模型是处理复杂逻辑最好的选择。前面提过,使用领域模型组织领域逻 辑,可以使系统具有很好的可重用性和可扩展性。它的缺点在于它到关系数据库 的映射问题。它需要一个数据映射层才能正常工作。解决方案是采取一个通用的 o rm a p p e r 去完成这工作。拥有一个好的o rm a p p e r ,将能最大地发挥领域 模型的作用。 1 2 对象一关系映射方法 这节介绍目前流行的一些从类映射到关系表的映射方法。这些方法分别是 将属性映射成列;实现继承;映射关联、聚合和组合;实现关系。 1 2 1 将属性映射成列 类属性将映射成关系数据库中的一列或几列,但并不是所有属性都需要保 存。例如,i n v o i c e 类会有g r a n d t o t a l 属性,这个属性由其实例在计算时使用, 但它不保存到数据库中。某些对象属性本身就是对象,例如c o u r s e 对象有一个 作为属性的t e x t b o o k 实例,它映射为数据库中的几列或者一个t e x t b o o k 类对应 的表,再使用外键关系把c o u r s e 和t e x t b o o k 关联起来。 也有可能将几个属性映射成表中的单一列。例如,代表美国邮递区号代码的 类可以有三个数字属性,每个都表示完整邮政编号代码中的每一部分,而邮政编 号代码可以在地址表中作为单一的列存储。 1 2 2 实现继承 ( 1 ) 将类映射成表 类到表的映射通常不是直接的。除了非常简单的数据库以外,不会有类到表 的一对一映射。下面讨论为关系数据库实现继承结构的三种策略: 整个类层次结构使用一个数据实体 每个具体类使用一个数据实体 每个类使用一个数据实体 第l 章综述 匡 厂1 薪高 厂下赢慕f 巨型型匡三刍 图卜2 将类层次结构映射成单一数据实体 这种方法的优点是简单,因为所需的所有人员数据都可以在一张表中找到, 所以在人们更改角色时支持多态性。缺点是每次在类层次结构的任何地方添加一 个新属性时都必须将一个新属性添加到表中。这增加了类层次结构中的耦合 如果在添加一个属性时有任何错误,除获得新属性的类的子类外,还可能影响到 层次结构中的所有类。它还可能浪费数据库中的许多空间。还必须添加 o b j e c t t y p e 列来表明行代表的是学生、教授还是其它类型的人员。在人们具有 单一角色时这种方法很有效,但如果他们有多个角色( 例如,一个人既是学生又 是教授) ,这种方法就会失效。 2 每个具体类使用一个数据实体 使用这种方法,每个数据实体既包含属性又包含它所表示的类继承的属性。 图卜3 描述了采取这个方法时图卜1 的类层次结构的持久化模型。有与s t u d e n t 类对应的和与p r o f e s s o r 类对应的数据实体,因为它们是具体类。但没有与 p e r s o n 类对应的数据实体,因为它是抽象类( 它的名称以斜体字表示) 。每个数 第l 章综述 据实体都分别分配了主键,s t u d e n t o i d 和p r o f e s s o r o i d 。 图卜3 ,将每个具体类映射成单个数据实体 这种方法最大的好处能相当容易地执行专门报告,例如如果要获取一个学生 或者教授的所有属性,只要所需的有关单类的所有数据都只存储在一张表中。 但也有几个缺点。第一,当修改类时,必须修改它的表和它所有子类的表。例如, 如果要向p e r s o n 类添加高度和重量,就需要同时更新两个表。第二,无论何时, 只要对象更改了它的角色可能学校聘用了一个刚毕业的学生作为教授,这样 就需要将数据复制到相应的表中,并为它指定一个新的o i d 。第三,很难在支持 多个角色的同时仍维护数据完整性。 3 每个类使用一个数据实体 使用这种方法,为每个类创建一张表,它的属性包括0 i d 和该类自身的属性。 图卜4 描述了采取这个方法时图卜1 的类层次结构的持久化模型。这里将 p e r s o n o i d 用作了所有三个数据实体的主键。 图卜4 将每个类映射成它自己的数据实体 这种方法能够最好地适应面向对象的概念。它能够很好地支持多态性,对于 对象可能有的每个角色,只需要在相应的表中保存记录。修改超类和添加新的子 类也非常容易,因为只需修改或添加一张表。这种方法也有几个缺点。第一,数 据库中有大量的表实际上每类都有一个( 加上维护关系的表) 。第二,使用 这种技术读取和写入数据的时间比较长。第三,有关数据库的专门报告很困难。 例如要获取一个学生的资料必须要访问s t u d e n t 表和p e r s o n 表。如果类层次架 9 墨! 兰堡姿 构有三层以上,那么就必须作两次以上的连接操作才能获取所需的数据。 ( 2 ) 比较映射策略 考虑对上述类层次结构做些简单的更改,如图卜5 中显示:添加了个 t e n u r e d p r o f e s s o r 类,它是从p r o f e s s o r 中继承的。 图卜5 扩展初始类层次结构 图卜6 显示了一个将整个类层次结构映射成一个数据实体的持久化模型。数 据库中的空间浪费增加了,但按照这种策略操作,只需花非常小的代价就可以更 新模型:只增加了一个属性t e n u r e a n n i v e r s a r y 。 图卜6 将扩展的层次结构映射成单一数据实体 图卜7 显示了将每个具体类映射成数据实体时的持久化模型。使用这个策 略,从教授提升到终身教授,只需要添加一个新表:t e n u r e d p r o f e s s o r 表。 1 0 第l 章综述 图l _ 7 将扩展的层次结构的具体类映射成数据实体 图卜8 显示了第三种映射策略的解决方案将单个类映射成单个数据实 体。需要添加一个只包括t e n u r e d p r o f e s s o r 类的新属性的新表。这种方法的缺 点是,要使用新类的实例,它需要好几个数据库访问。 图卜8 将扩展的层次结构韵所有类映射成数据实体 每种办法都有其优缺点。在下面的表卜2 中对它们进行比较。没有最好的方 法,要根据实际需要来采取不同的映射方法。 考虑因素 钋髫张表l每个表萎类8 张9 表姜i一l i专门报告容易中等中等困难 第1 章综述 考虑因素每个层次结构一 每个表萎类0 张0 表主l一l 张表 实现的难易程度 0 容易中等 困难 i 数据访问的难易程度0 容易 0 容易 中等容易 耦合 0 非常高 ll 高 低 数据访问速度 快快中等快 对多态性的支持 0 中等低 8 高 i i 表卜2 比较映射继承的各种办法的优缺点 1 2 3 映射关联、聚合和组成 映射对象时不仅需要将对象映射到数据库中,还必须将对象之间的关系进行 映射,以便在读取对象时进行恢复。对象之间有四种类型的关系:继承、关联、 聚合和组成。要有效地映射这些关系,必须理解它们之间的差异、如何实现一般 的关系,以及如何实现特定的多对多关系。 在图l 一9 中有三个类,其中两个在它们之间有简单的关联关系( a i r p o r t 和a i r p l a n e ) ,有两个共享聚合关系( 或者称为组合) 。从面向对象的观点看, 聚合组合和关联是不同的。在聚合情况下,在读取整体时,通常需要读取其组 成部分;而在关联情况下,需要执行什么操作并没有强制的规定。在将对象保存 到数据库中或从数据库中删除对象也存在相同的情况。 图卜9 关联和聚合组合之间的差异 第1 章综述 1 2 4 实现关系 关系数据库中的关系是通过使用外键来维护的。外键是在一张表中出现的一 个或多个数据属性;它可以是另一张表的键的一部分列,或者就是另一张表的键。 外键将一张表中的一行与另一张表中的一行相关起来。要实现一对一和一对多的 关系,只需将一张表的键包括在另一张表中的列中。 在图1 1 0 中有三张表,它们的键( o i d ) 和外键用于在它们之间实现关系。 首先,在p o s i t i o n 和e m p l o y e e 数据实体间有一个一对一的关联。一对一关联 就是它的每个复合度的最大值都是l 的关系。要实现这个关系,需要在 e m p l o y e e 数据实体中使用属性p o s i t i o n 0 i d ,即p o s i t i o n 数据实体的键。由 于关联是单向的e m p l o y e e 那些行知道它们的p o s i t i o n 行,但反过来就不行。 如果这是个双向的关联,则必须在p o s i t i o n 中添加一个名为e m p l o y e e o i d 的 外键。然后使用相同的方法在e m p l o y e e 和t a s k 之间实现了多对一关联( 又称为 一对多关联) ,唯的不同是将外键放在了t a s k 中,因为它在关系的“多”方。 第l 章综述 图卜1 0 简单人力资源数据库的持久化模型 要实现多对多关系,需要关联表的概念。它是一种数据实体,目标是在关系 数据库中维护两个或多个表之间的关联。图1 1 0 中,在e m p l o y e e 和b e n e f i t 之间有一个多对多关系。图1 1 l 中,使用关联表来实现多对多关系。在关系数 据库中,关联表中包含的属性是关系中涉及到的表中的键组合。关联表的名称通 常是它所关联的表的名称组合,或者是它实现的关联的名称。 融叫印* 轴艇 l 知德i t 溺舯c 精b b l 睁国榔喇州嘲唧咖 p 懈嘶哪叼 搴| 研b t 脚嚏钿tlp 弧 孺孵呷r 啊吖p l- 镘州o 觏由蛔 炉妇n 洲卜如峨髀i 吲 图卜1 1 在关系数据库中实现多对多关系 第l 章综述 而对于关联复合度的规则是,一旦引入了关联表,复合度就“交叉”,如图 1 1 2 所示。值为r 的复合度总在两个主表的方向,如图1 一1 1 和1 1 2 中 所示,以保留原始关联的整体复合度。原始的关联表明雇员有一种或多种福利, 并且任何给定的福利都给予一个或多个雇员。在图1 一1 2 中可以看到,即使在有 关联表维护关联的情况下仍然是这种情况。 1 3 关键技术 图卜1 2 关联表复合度规则 在0 r m a p p e r 中使用了几种关键技术:对象序列化技术、元数据信息、a d 0 x 和a d 0 n e t ,下面对这几种关键技术作一些简单的介绍。 1 3 1 对象序列化技术 序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是 反序列化,它将流转换为对象。这两个过程结合起来,就可以存储和传输数据了。 n e tf r 锄e w o r k 提供两种序列化技术:二进制序列化和x m l 序列化。”1 二进制序列化保持类型保真度。可以将对象序列化到流、磁盘、 内存和网络等等。 ) ( m l 序列化仅序列化公共属性和字段,且不保留类型保真度。由 于x m l 是一个开放式标准,因此适用于通过w e b 共享数据。 第l 章综述 两种序列化技术的使用是大同小异的。图l 1 3 演示了两种序列化技术的使 用过程。 图l 一1 3 序列化与反序列化过程 如果要序列化对象,首先要准备一个序列化器,可以是二进制序列化器也可 以) ( m l 序列化器。然后使用序列化器把对象转换成一串二进制数据或删l 文档数 据,并把这些数据保存到一个流中。流表示某种媒体在内存中的缓冲。保存到流 中表示把数据保存到某种媒体之中,例如磁盘,网络等等。等到需要的时候再进 行反序列化过程。 反序列化的过程与序列化过程完全相反。首先从流中读取数据,然后使用序 列化器对数据进行还原操作,最后就可以得到还原的对象了。 1 3 2 元数据信息 元数据信息表示类的自身信息,包括类的成员以及成员类型等等。 使用n e t 的反射( r e f l e c t i o n ) 功能可以获取元数据信息。使用这些信息, 可以动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型, 还可以调用类型的方法或访问其字段和属性瑚。 s y s t e m t y p e 类对于反射起着核心的作用。当反射请求加载的类型时,n e t 的公共语言运行库将为它创建一个t y p e 。使用t y p e 对象的方法、字段、属性和 嵌套类可以查找有关该类型的所有信息。 有两个方法来获得一个类型的t y p e 对象。第一是使用t y p e o f 运算符,例如 t y p e o f ( i n t ) 将返回i n t 类型的t y p e 对象。这种方法适用于静态类型的绑定。 第二是使用对象的g e t t y p e ( ) 方法。对任意一个对象调用该方法,将返回该对 象实际类型的t y p e 对象。在获得对象的t y p e 对象以后,就可以对该t y p e 对象 进行分析,从而得知该类型的字段,方法等信息。 1 6 第l 章综述 1 3 3a d o x m 1 c r o s o f ta c t i v e xd a t a o b j e c t se x t e n s i o n s f o rd a t a d e f i n i t i o n l a n g u a g ea n ds e c u r i t y ( a d o x ) 是对a d o 对象和编程模型的扩展。a d o x 包括 用于数据库创建和修改的对象。它基于对象实现数据库操作。用户可以编写对各 种数据源都能有效运行的代码,而与它们原始语法中的差异无关。 a d o x 是核心a d o 对象的扩展库。它公开韵对象可用于创建、修改和删除数 据库中的对象,如表格和过程等。它还包括安全对象,可用于维护用户和组,以 及授予和撤消对象的权限。 目前这套组件并没有移植到n e tf r 硼e w o r k 中,只能使用它的c 伽版本。 下面简单介绍一下a d o x 的对象层次关系以及它们的功能。如图卜1 4 和表卜2 “: 图1 一1 4a d o x 的对象层次关系 对象说明 c a t a l o g 包含描述数据源模式目录的集合。( 即数据库本身) c o l u m n 表示表、索引或关键字的列。 g r o u p表示在安全数据库内有访问权限的组帐号。 第1 章综述 对象 说明 i n d e 盖 表示数据库表中的索引。 k e y 表示数据库表中的主键、外键或唯一索引键。 p r o c e d u r e 表示存储的过程。 t a b l e 表示数据库表,包括列、索引和关键字。 u s e r 表示在安全数据库内具有访问权限的用户帐号。 v i e w 表示记录或虚拟表的过滤集。 表l 一2a d o x 对象功能 a d o x 的对象结构描述了数据库的结构。利用这些对象,可以方便地增加、 删除数据库的相应对象,以完全面向对象的观点去操纵这些对象。但不同的数据 源对于a d 0 x 的支持程度并不一样。下面是s q ls e r v e r 对a d 0 x 的支持说明 对象和集合 使用限制 c a t a l o g 对象 不支持c r e a t e 方法 该对象建立之前可以读写其属性,而建立之后 t a b l e 对象 其属性只读。 v i e w s 集合 不支持视图集合 p r o c e d u r e s 集合 不支持a p p e n d 和d e t e l e 方法 p r o c e d u r e 对象不支持c o 咖a n d 属性 k e y s 集合不支持a p p e n d 和d e t e l e 方法 u s e r s 集合 不支持该集合 g r o u p s 集合不支持该集合 表l 一3s q ls e r v e r 对a d o x 的支持限制 本文的工作以s q ls e r v e r 作为主要的测试对象,一切测试结果都以在s q l s e r v e r 上的运行结果为准。 第l 章综述 1 3 4a d 0 n e t a d 0 n e t 是一组向n e t 程序员公开数据访问服务的类。a d o n e t 为创建分 布式数据共享应用程序提供了组丰富的组件。它提供了对关系数据、x m l 和应 用程序数据的访问。a d o 。n e t 支持多种开发需求,包括创建由应用程序、工具、 语言或i n t e r n e t 浏览器使用的前端数据库客户端和中间层业务对象。 设计a d 0 n e t 组件的目的是为了从数据操作中分解出数据访问。a d 0 n e t 的两个核心组件会完成此任务:d a t a s e t 和n e tf r a j n e w o r k 数据提供程序,后 者是一组包括c o n n e c t i o n 、c 0 姗a n d 、d a t a r e a d e r 和d a t a a d a p t e r 对象在内的 组件。 a d o n e td a t a s e t 是a d 0 n e t 的断开式结构的核心组件。d a t a s e t 的设计 目的很明确:为了实现独立于任何数据源的数据访问。因此,它可以用于多种不 同的数据源,可用于x 札数据,或用于管理应用程序本地的数据。d a t a s e t 包 含一个或多个d a t a t a b l e 对象盼集合,这些对象由数据行和数据列以及主键、 外键、约束和有关d a t a t a b l e 对象中数据的关系信息组成。 a d o n e t 结构的另一个核心元素是n e tf r a i l l e w o r k 数据提供程序,其组件 的设计目的是:为了实现数据操作和对数据的快速、只进、只读访问。c o n n e c t i o n 对象提供与数据源的连接。c o 啪a n d 对象能够访问用于返回数据、修改数据、运 行存储过程以及发送或检索参数信息的数据库命令。d a t a r e a d e r 从数据源中提 供高性能的数据流。最后,d a t a a d a p t e r 提供连接d a t a s e t 对象和数据源的桥 梁。d a t a a d a p t e r 使用c o 嘲a n d 对象在数据源中执行s q l 命令,以便将数据加 载到d a t a s e t 中,并使对d a t a s e t 中数据的更改与数据源保持一致。 开发者还可以为任何数据源编写n e tf r a i i l e w o r k 数据提供程序。n e t f r 硼e w o r k 提供了四个n e tf r a m e w o r k 数据提供程序:s q ls e r v e r n e t f r a m e w o r k 数据提供程序、o l ed b n e tf r 鲫e w o r k 数据提供程序、o d 8 c n e t f r a m e w o r k 数据提供程序和o r a c l e n e tf r 锄e w o r k 数据提供程序。 1 9 第l 章综述 1 3 5 自定义属性 自定义属性用于把一些自定义信息附加到类的元数据中。在0 r m a p p e r 中, 需要类的一些额外信息,例如关联类的类型等等。但这些信息不能单纯地由类本 身的元数据所提供,而需要类的编写者提供。而0 rm a p p e r 则负责读取这些元 数据信息,根据这些信息作出一定的决策。下面简要叙述一下自定义属性及其使 用方法。 ( 1 ) 属性用途 属性可以描述如何序列化数据,指定用于强制安全性的属性,以及限制实时 ( j i t ) 编译器的优化以使代码易于调试。属性还可以记录文件名或代码作者,或 在窗体开发阶段控制控件和成员的可见性。 ( 2 ) 编写属性 设计自定义属性,本质上是直接或间接地从s y s t e m a t t r i b u t e 派生的传统 类。与传统类一样,自定义属性也包含存储和检索数据的方法。 正确设计自定义属性类的主要步骤如下: 压立用a t t r i b u t e u s a g e a t t r i b u t e 声明属性类 声明构造函数 声明属性 ( 3 ) 应用属性 通过下列过程将属性应用到代码元素。 1 通过从n e tf r 硼鲫o r k 导入属性的命名空间来定义新的属性 或使用现有属性。 2 初始化紧挨在要描述的元素前面的属性,并用所需标志或信息调 用该属性的构造函数。 属性在编译代码时被发送到元数据中,并可通过运行库反射服务读取出来。 这些属性信息可用于公共语言运行库以及任何自定义工具或应用程序。 ( 4 ) 检索存储在属性中的信息 首先,声明要检索的属性实例。然后,使用a t t r i b u t e g e t c u s t o m a t t r i b u t e 第l 章综述 方法将新属性初始化为要检索的属性值。初始化新属性后,只需使用其属性获取 值即可。 1 4 本文工作 首先,本文讨论了应用软件的结构形式,指出了使用领域模型的模式来组织 领域逻辑的优势,也指出了使用领域模型映射到数据源层的困难。本文还描述了 从对象映射到关系数据库的一些映射方法。在此基础上,本文设计并实现了解决 这个问题的映射工具:o rm a p p e r 。该o rm a p p e r 工作在n e t 平台,它实现了 把对象保存到关系数据库的功能。它可以自动根据类结构来生成关系表结构,以 处理一般的n e t 对象的增加,删除以及修改功能,而且无需用户自己建立映射 文件就可以进行动态映射。 本文的第1 章描述了o rm a p p e r 的使用背景,接着第2 章描述了o rm a p p e r 的设计方案,而第3 章根据设计方案详细叙述了在n e t 平台上使用c # 语言实现 该0 rm a p p e r 的过程。第4 章以一个常见的案例描述0 rm a p p e r 的具体应用。 第5 章对0 rm a p p e r 功能进行了总结。 2 l 第2 章0 瓜m 叩p e r 设计方案 第2 章0 rm a p p e r 设计方案 2 1 0 rm a p p e r 设计目标 o ,rm a p p e f 的主要作用是把领域层中的领域对象持久化到关系数据库。在 这个过程中,首先是结构的映射。类结构和关系结构有很多的不同

温馨提示

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

最新文档

评论

0/150

提交评论