本来如果和关系模型一样,只需要一对一、一对多、多对多映射就够了,但是前面《Hibernate征途(四)之映射 序》中说到,对象模型中关联是有方向的,所以对一对多而言,就会产生一对多还是多对一的问题,同时一种映射会产生两种方向,简单罗列一下如下:

  • 多对一映射
  • 一对一单向主键映射
  • 一对一双向主键映射
  • 一对一单向唯一外键关联
  • 一对一双向唯一外键关联
  • 一对多单向关联
  • 一对多双向关联
  • 多对多单向关联
  • 多对多双向关联

鉴于前面提到的理由,我不会对每个映射细粒度分析,以下我们从类属性、映射文件、数据库表来解释一下这些映射。

方向

上面罗列的映射都提到方向的问题,在前面的博客中提到对象模型的关联是有方向的,也对这种方向做了简单的阐述,下面我们用班级Classes和学生Student两个类来说明一下方向:

无方向

Student

public class Student {

	private int id;
private String name;
//省略getter和setter……
}

Classes

public class Classes {

	private int id;
private String name;
// 省略getter和setter……
}

很明显,这种情况下,知道Student和Classes哪个对象都不知道另外一个对象的存在。

单向双向

Student

    public class Student {

        private int id;
private String name;
private Classes classes;
//省略getter和setter……
}

Classes

public class Classes {

	private int id;
private String name;
//省略getter和setter……
}

在这种情况下,知道一个Student对象,就可以知道它多对应的Claases对象,反之则不行,这为单向;同样,如果在Classes中也添加对Student的引用,就是双向关联,此时二者可以相互知道对方的存在。

综合上面所说,所谓的方向性,就是是否有另外一个对象的引用,当然因为还需要Hibernate的映射文件中添加属性的映射;同时这种方向性并不会影响到数据的存储结构。

数量

抽离上面说到的方向,文章最开始提到的多种映射可以分为:一对一映射、多对一映射、一对多映射和多对多映射。如果从关系模型上看,这种数量对应的存储之间的关联,如果从对象模型上看,我认为它的意思是一种对象包含或引用另外一种对象的数量关系,这种关系最直接的体现在属性和映射上面,同时多对一还是一对多基于的角度不同,例如以一对多双向映射中的Student和Classes为例:

从Student的角度看,有关Classes的属性为:

	private Classes classes;

映射文件中关于classes的为:

    <many-to-one name="classes"  column="classesid" />

从Classes的角度看,有关student的属性为:

	private Set students;

映射文件中关于students的为:

    <set name="students"  inverse="true">
<key column="classesid" />
<one-to-many class="com.tgb.hibernate.Student" />
</set>

说到这里,再说一下映射文件与表中列的关系,最开始的博客就说到,property和id标签都会产生对应的数据列,那么映射文件中关于数量的标签会不会产生列?这取决于对应方式。

综上来看,“数量”说的是引用的方式(一还是多)及对应的数量映射标签。

综合

上面抽离出数量和方向,接下来把最上面罗列的映射大体分析一下。

一对一

如果是一对一的映射,会有两种方式:

  • 主键:在关系模型中,两张表使用其中一张表的主键,保证一一对应。
  • 外键:在关系模型中,体现的是一张表使用另外一张表的外键,不过要求此外键唯一,实际上这是个特殊的一对多关联,使用<many-to-one name="idCard" unique="true" />。

多对一和一对多

一对多和多对一映射的原理是相同的,都是在多的一端加入一个外键关联,二者之间的区别是在于维护的关系不同,仍然以Student和Classes为例:

  • 在多对一中,添加的维护是在Student一端:
<hibernate-mapping >
<class name="com.tgb.hibernate.Student" table="t_student">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<many-to-one name="classes" column="classesid" />
</class> </hibernate-mapping>

它们是多指向一的关系,通过维护这个关系,在加载多的一端时,可以把一的一端一起加载。

  • 在一对多中,添加的维护是在Classes一端:
<hibernate-mapping >
<class name="com.tgb.hibernate.Classes" table="t_classes">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<set name="students">
<key column="classesid" />
<one-to-many class="com.tgb.hibernate.Student" />
</set>
</class>
</hibernate-mapping>

它是一指向多的关系,维护二者的关系,在加载一的一端的时候可以把多的一端加载上来。

多对多

在关系模型中,多对多的关系会使用中间表维护,映射到对象模型中一样。以角色Role和用户User为例:

Role

<hibernate-mapping >
<class name="com.tgb.hibernate.Role" table="t_role" >
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<set name="users" table="t_user_role">
<key column="role_id" />
<many-to-many class="com.tgb.hibernate.User" column="user_id"/>
</set>
</class> </hibernate-mapping>

User

<hibernate-mapping >
<class name="com.tgb.hibernate.User" table="t_user" >
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<set name="roles" table="t_user_role">
<key column="user_id" />
<many-to-many class="com.tgb.hibernate.Role" column="role_id" />
</set>
</class>
</hibernate-mapping>

在多对多中,把关系表与其中一张实体表理解成多对一的关系,更有助于理解。

总结

这篇博客没有针对每种映射说明,只是抽象出这些数量和方向型映射的共性,希望可以给大家一些理解的思路。下篇博客介绍组合主键映射和集合映射。

Hibernate征途(六)之数量和关系映射的更多相关文章

  1. JavaEE之Hibernate(开放源代码的对象关系映射框架)

    Hibernate(开放源代码的对象关系映射框架) 1.简介 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全 ...

  2. Hibernate(开放源代码的对象关系映射框架)

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自 ...

  3. HIbernate学习笔记(五) 关系映射之一对多与多对一

    三.       多对一 –单向 场景:用户和组:从用户角度来,多个用户属于一个组(多对一 关联) 使用hibernate开发的思路:先建立对象模型(领域模型),把实体抽取出来. 目前两个实体:用户和 ...

  4. Hibernate学习笔记(四)关系映射之一对一关联映射

    一. 一对一关联映射 ²        两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²        有两种策略可以实现一对一的关联映射 Ø        主键关联:即让 ...

  5. Hibernate框架之双向多对多关系映射

    昨天跟大家分享了Hibernate中单向的一对多.单向多对一.双向一对多的映射关系,今天跟大家分享下在Hibernate中双向的多对多的映射关系 这次我们以项目和员工举个栗子,因为大家可以想象得到,在 ...

  6. Hibernate学习笔记三:对象关系映射(一对一,一对多,多对一,多对多)

    如需转载,请说明出处:http://www.cnblogs.com/gudu1/p/6895610.html Hibernate通过关系映射来表示数据库中表与表之间的关系,关系映射可以通过两种方式:配 ...

  7. Hibernate学习笔记(五) — 多对多关系映射

    多对多关系映射 多对多建立关系相当于在第三张表中插入一行数据 多对多解除关系相当于在第三张表中删除一行数据 多对多改动关系相当于在第三张表中先删除后添加 多对多谁维护效率都一样.看需求 在实际开发过程 ...

  8. Hibernate框架学习之注解配置关系映射

         上篇文章我们通过注解对映射了单个实体类,但是具体项目中往往实体类之间又是相互关联的,本篇文章就是从实体类之间存在的不同关联角度,具体学习下如何映射他们之间的关联,主要涉及内容如下: 单向的一 ...

  9. Hibernate(六)——多对多关联映射

    前面几篇文章已经较讲解了三大种关联映射,多对多映射就非常简单了,不过出于对关联映射完整性的考虑,本文还是会简要介绍下多对多关联映射. 1.单向多对多关联映射 情景:一个用户可以有多个角色,比如数据录入 ...

随机推荐

  1. C# chart绑定数据的方式整理

    C#chart 画图曲线的条数决定是你的数据源也就Series.Series是对象 你动态创建就可以了. 一.数组, List 等简单Collection类型的方式 Series s1= new Se ...

  2. 【剑指offer 面试题17】合并两个排序的链表

    思路: 比较两个链表端点值的大小,通过递归的方式排列. #include <iostream> using namespace std; struct ListNode { int val ...

  3. [Tommas] 测试用例覆盖率(三)

    三.测试数据的设计 每一个测试思路最终都要转化成具体的数据才能来执行.关于测试数据设计的方法也不外乎那几种,就不再赘述了.此处单就一些经常易犯的错误,提出一些注意点,作为用例数据设计时的参考: 1.尽 ...

  4. 【和我一起学python吧】初学Python,版本如何选择?

    早在四年多以前,在我进入英才网之前,去面试过一家海归创业的公司.他们需要的是有unix开发经验的技术人员,但是因为他们当时所处的阶段对很多成熟 技术人员不是很吸引,所以条件放宽为熟悉面向对象的程序开发 ...

  5. JS单例设计模式

     单例,指的是只有一个实例的对象.    在应用单例模式时,生成单例的类必须保证只有一个实例的存在,很多时候整个系统只需要拥有一个全局对象,才有利于协调系统整体的行为.比如在整个系统的配置文件中,配置 ...

  6. 暴雪hash算法

    你有一个非常大的字符串数组A,现在又有一个字符串B,需要你去检测B是否存在于A中.最简单粗暴的方法是遍历整个A,但是这个方法投入到实际应用时的运行速度是难以接受的.在没有与其他所有字符串比较前怎么知道 ...

  7. Uva 208 - Firetruck

    [题目链接]http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&p ...

  8. Mongoose:Schema之路

    说明:本文在个人博客地址为edwardesire.com,欢迎前来品尝. Mongoose学习 这里的Mongoose当然不是图片上的萌物,它是一个MongoDB对象建模工具(object model ...

  9. 第二百九十八天 how can I 坚持

    晚上和同学一块吃了个饭,聊了好多. 晚上回来的路上,突然想起一句话,现在又忘了. 睡觉. 人生平淡也好,光彩也罢,只是一个历程,算了,睡觉.

  10. Hibernate之HQL查询

    一.Hibernate 提供了以下几种检索对象的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 HQL 检索方式:使用面向对象的 H ...