`

收藏-O/R MAPPING方法小结

阅读更多

(一)对象之间的关系:

  1.依赖:

  依赖对象通过调用被依赖对象的方法来获得服务。一种比较松散的关系,并且是短期的。我们的过程与对象往往依赖于我们的实体域对象。如在struts 的 action中调用模型层的方法。

  2.关联

  它使一个类指到另一个类的属性。长期的

  3.聚合

  聚合关系是关联关系的一种,是强的关联关系。聚合是整体和部分之间的关系。

  4.组合

  也叫合成关系,组成关系是关联关系的一种,是比聚合关系强的关系。对象负责代表部分的对象的生命周期。

  注:既然聚合,组合关系属于关联关系,那么如何区分一般关联关系,聚合关系和组合关系呢?

  一般关联:只要一个对象联系到另外一个对象就形成了关联关系。如:人和他的猫,黑豹乐队和窦魏,pc机和显示器。

   聚合关系:一种强关联关系,它要求有部分和整体的关系,并且没有了整体部分也可以独立存在。在上面三个例子中人和它的猫显然没有部分和整体的关系,所以 只能是一般的关联关系。而黑豹乐队和窦魏,窦魏等人组成了黑豹乐队即:窦魏和黑豹是整体和部分的关系。而窦魏脱离了黑豹(早就离开了)更或者黑豹不存在了 那么窦魏仍然可以以音乐人的身份存在(即对象仍然可以独立存在)所以它属于聚合关系。组成关系是可以共享的。(窦魏也可以加入其他乐队)。

  组合关系:一种更强的整体和部分的关系。它并且要求代表整体的对象负责代表部分的对象的生命周期,组成关系是不能共享的。如:pc机和显示器的关系。


   我觉得:如果两个实体是整体和部分的关系,那么它们到底是聚合还是组合,这取决于你的需求。比如说:pc机和显示器的关系,如果你的系统中,显示器脱离 了pc机就不存在意义了,也可以说:所有显示器的访问都是通过pc机进行的,那么你可以把关系设定为组合(如你在为一个只买品牌机的代理商作系统你可能是 可以这么作的)。如果你的显示器脱离的pc机仍然可以独立存在,也就是说在系统中可以直接访问显示器对象,那么你可以将关系设为聚合(如你在为一个买散件 的代理商作系统你可能是可以这么作的)

 

      5 .继承

  这个我不想多讲了,用过面向对象的语言都应该知道。

  (二)关系数据库的关系

  一对一

  一对多

  多对一

  多对多

  (三)o/r mapping 策略

  1 .继承:

  对于继承关系一般有三种策略:

  à 策略1: 继承树的每个类对应一个表<joined-subclass >

特点: 共享主键

  à 策略2: 继承树的根类对应一个表<discriminator ><subclass >

  特点: 需要添加一个识别字段

  à 策略3: 继承树的叶子类对应一个表

  特点: 不支持多态查询

  2 .关联

  21 一对一

  一般有两种策略:

  策略1 :唯一的外键

  <many-to-one>+unique="true" ( 唯一的外键)

  <one-to-one>

  策略2 :共享主键

  <one-to-one>

  <one-to-one><constrained="true"> ( 既是主键又是外键)

  注意:生成方式需要用:foreign

  22 一对多(无需多说)

  23 多对一(无需多说)

  24 多对多

  策略1A,B 表多对多的关系需要引入C 表。

  C 表中的所有属性即为主键又为外键分别参照A,B 两表。

  C 表中不可以有其他属性

  策略2 :将多对多拆分成两个一对多:

  A,B 对象多对多的关系需要引入C 对象, 使得A,B 两对象与C 对象的关系为一对多。对应数据库中:A,B 表多对多的关系需要引入C 表。A,B 两表与C 表的关系为一对多。

  C 表有自己的主键

  C 表中有非主键的外键分别参照A,B 两表。

  C 表中不可以有其他属性

  如;学生和课程之间为多对多的关系, 那么引入学生选课。

  注意:策略1 和策略2 的不同在于:策略2 引入了新的对象而策略1 没有。这是因为这样:策略1c 表不能有自己的东西。而策略2 有。

 

    2.5 其他

  上面说过:聚合与组成是关联的一种所以他们也符合以上策略。

  特别的:当用到组合关系的是否我们可用用到hibernate的"组件"<component>.由于"组件"它完全可以满足组成关系的强关联。

  3.依赖

  一般不在实体域对象中体现。

  O/R MAPPING (HIBERNATE)方法小结 (补充内容):

  另外我看到了一种"键关联"的方法,感觉很有道理。我理解了一下总结如下:

  1.一般关联:

  这种方法对于一般的关联总是引入c表(另外的一张表)仅仅表示关系。

  C表的主键有分别指向A,B两表(外键)。当指向一方的外键unique="true"即唯一,那么这一方为"一",反之为"多"的一方。这样就可以形成一般的关联关系。但是注意的是:c表不映射为对象。C表也没有自己的属性。

  2.聚合和组成

  当实体A的非主键列中有一个引自实体B的时候,这种关系是B聚合A。如果这种引用是强制性的,则是合成关系,否则为聚合关系。是否为强制性,只需要将引用列设为非空即可;

  3.继承

  当实体A的主键引用自实体B的时候(即为外键),那么A继承 B。

   总结:我觉得O/RM的方法有很多,我们可以看到"按外键"的方法思路很清晰。但是它在解决一般的关联的时候总是引入另外一张表这样势必影响效率。另 外,既然聚合和组合是关联的一种那么即使是组合关系我也把它看成一般关联,也不算错的。关系数据库一开始就不是为了面向对象的语言服务的,所以我们在这里 映射无论那种方法似乎都不能说是完全的,正确无误完成了O/RM。

  所以我觉得一切都要看我们的项目需求。因地制宜!

分享到:
评论

相关推荐

    Macrobject NObject O/R Mapping 框架

    NObject O/R Mapping 框架包含了 OQL.NET,一套基于 C# 和 VB.NET 等原生 .NET 语言的强类型对象查询语言 (OQL, Object Query Language) 使您甚至不需要写一行 SQL 语句。 ??NObject O/R Mapping 框架能帮您减少 30...

    O/R_Mapping思想

    O/R_Mapping思想与ADO.NET 基于.NET的Web应用框架的设计与实现 将对象映射到关系数据库——对象/关系映射(O/R_Mapping)详解 面向对象设计中的O/R映射架构

    hibernate如何用O/R Mapping框架来实现我们的数据层

    理解典型的三层架构,如何用O/R Mapping框架来实现我们的数据层。这里主要介绍现在非常流程的Hibernate框架,,掌握Hibernate相关的概念;并如何做对象和关系的映射,如何在应用中使用Hibernate

    泛型、反射 实现 O/R mapping 示例

    通过泛型、反射 实现文本的 O/R mapping 示例

    MJDU v6.0 及使用教程(注解+反射+XML+O/R Mapping+R/O Mapping)

    组件出版于 2012 年末横空出世,由于不会炒作,...我才发现原来在 2013 年时上传的 0.04 版本是不带 OR/RO Mapping 机制的。。。 想了想,还是补上 v6 这个带 OR/RO Mapping 机制的版本吧,虽然是同一时期的产物。

    Landslide-susceptibility-mapping-main

    https://github.com/scar-on/Landslide-susceptibility-mapping (scar-on/Landslide-susceptibility-mapping)

    o-x-mapping测试

    通过schema生成java对象,读写xml文件

    Hibernate O/R Mapping 入门工程包

    Hibernate 快速入门的工程包 包括用xml和annotation映射数据表

    Tornado O/R Mapping Engine-开源

    Tornado / DB是Java的对象关系映射引擎。 功能包括对象缓存,多表继承,复合键,关系,XML配置,JSP标记,占用空间小。

    advanced-mapping-tool:Dataninja 的另一个高级映射工具

    高级映射工具 Dataninja 的一个非常先进的...cp dataninja-advanced-mapping-tool.conf.sample.js dataninja-advanced-mapping-tool.conf.js cp dataninja-advanced-mapping-tool.custom.sample.css dataninja-advance

    动态加载图片

    &lt;mime-mapping&gt; &lt;extension&gt;htm&lt;/extension&gt; &lt;mime-type&gt;text/html;charset=gb2312&lt;/mime-type&gt; &lt;/mime-mapping&gt; &lt;mime-mapping&gt; &lt;extension&gt;html&lt;/extension&gt; &lt;mime-type&gt;text/html;charset=gb2312&lt;/mime-...

    群联PS2251-61/91量产工具U3_Sorting_MLC.rar

    TestReadWrite_Percentage = 0TestReadWrite_Cycle = 1Reset Serial Number=0SetPartialTiming=1Mapping=0[TestItemOption]Do Preformat Test=1[Extra]Mode=3[Misc]Volume Label=USB DISKBurner Erase ...

    Jetson-TX2-GPIO-mapping.xlsx

    Jetson-TX2-GPIO-mapping.xlsx

    Spring MVC 框架应用实例

    &lt;filter-mapping&gt; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt; &lt;/filter-mapping&gt; &lt;servlet-name&gt;ideawu&lt;/servlet-name&gt; &lt;servlet-class&gt; org.springframework.web...

    OR Mapping中对象关系映射解决方案汇总

    O/R Mapping中对象关系映射解决方案汇总 对于一个ORM方案时,为了提供用户对具体映射方案的细颗粒度的控制的可能,特别对于企业级应用,应该是用户选择是否使用该产品比较重要的因素之一,需要尽可能多的实现...

    Mapping Objects to Relational Databases O-R Mapping In Detail.doc

    Mapping Objects to Relational Databases O-R Mapping In Detail.doc

    hibernate-mapping参数详解

    hibernate-mapping

    madCodeHook.pas

    // (a) Create/OpenGlobalMutex + Event + FileMapping added // (b) WideToAnsi + AnsiToWide functions added // (c) RenewHook function added // (d) madCodeHook.dll -&gt; madCHook.dll (8.3 dos name logic) // ...

    hibernate-mapping-3.0.dtd

    hibernate-mapping-3.0.dtd 配置后,就会在xml中进行提示

    CIS-Security-Controls-Mapping-EN

    CIS-Security-Controls-Mapping-EN,这是安全基线控制矩阵,可以帮助用户更好的评估安全基线,设计安全基线,您可以根据不同系统安全等级,设计适合自己的安全基线控制矩阵

Global site tag (gtag.js) - Google Analytics