关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用。  

  一、Hibernate多对一关联映射:就是在“多”的一端加外键,指向“一”的一端。

  比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系。

  

  1、“多”端实体加入引用“一”端实体的变量及getter,setter方法。

  比如说多个学生对应一个班级,在学生实体类加入:private Grade grade;

  2、“多”端配置文件,student.hbm.xml里的标签设置:<many-to-one name="grade" column="gradeId" ></many-to-one>

  二、Hibernate单向的一对一主键关联映射:就是让两个实体的主键一样,就不需要加入多余的字段了。

  比如一个学生对应一个身份证号,一个学生对应一条户口信息等等,都是一对一关联映射。

  

  1、Person实体里要持有IdCard的引用。在Person实体里加入属性:Private IdCard idCard;

  2、Person端维护关系,所以需要重点看Person的配置文件,Person.hbm.xml通俗来讲 ,就是就是Person中的Id既为主键又为外键。

    所以需要修改Person中的id标签:通俗来讲是告诉Person里的id去关联哪个实体里的id。

    此处的foreign生成策略,会取得关联对象的标识。

    此处的property标签内是关联对象。

    

<id name="id">
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>

    

   

  3、在Person.hbm.xml中添加关联关系的标签:<one-to-one name="idCard" constrained="true"><one-to-one/>

    这里的one-to-one标签指示hibernate如何加载其关联对象,默认根据主键加载也就是拿到关系字段值,根据对端的主键来加载关联对象。

    这里的constrained="true"表示当前主键Person的id主键,还是一个外键,参照了对应端的主键IdCard的id主键,会生成外键约束语句。

    注:采用foreign映射策略在保存person对象的同时也会保存关联的对象,也就是idCard,他们之间还有级联关系。但是反之就不可以,也就是说,如果只保存IdCard对象,是会出错的,不会保存Person对象,因为关系的维护端在Person端,IdCard根本就不知道Person的存在。主键关联映射有弊端,不好维护。

  三、Hibernate双向一对一关联映射:有些需求要求从一端可以查到另一端,从另一端又可以查到这一端,就需要双向的关联映射。

  比如说,想要根据人的信息查到他的户口信息,也想根据户口信息查到这是哪个人的信息等。

  

  1、修改对象模型,在IdCard.java 的实体里加入Person的引用,添加属性:private Person person;(在Person.java实体里也有IdCard的引用哦)

  2、修改IdCard.hbm.xml文件,添加one-to-one标签。

  

<one-to-one name="person"/>

  注1:one-to-one标签不影响存储,只影响加载,不会修改数据库,也就是说不会添加字段,而many-to-one会修改数据库,会增加一个字段。

  注2:了解抓取策略:fetch="select" 可以控制查取数据的顺序。

  四、单向一对一唯一外键关联映射:一对一主键关联不好维护,用外键关联对象比较好。原理:多对一的特殊情况。

  比如说还是Person和IdCard的例子。

  1、Person.java是实体里有IdCard的引用,即加入属性:private IdCard idCard;IdCard.java里没有Person引用。

  2、配置文件:IdCard.hbm.xml里都是普通属性。Person.hbm.xml的主键生成策略需要改变:改回:

  

<generator class="native"/>

  使用标签many-to-one和unique  : <many-to-one name="idCard" unique="true"/> ,这样就限制了多的一端的唯一性。

  注:这里需要先保存IdCard.否则报错。

  五、双向一对一唯一外键关联:如果有需求要求的情况下,也可以建立双向的外键关联。

  1、在Person和IdCard里添加对应端的引用,即添加相应属性。

  2、person.hbm.xml和例子(四)中一样,修改IdCard.hbm.xml文件,添加one-to-one标签:<one-to-one name="person" property-ref="idCard"></one-to-one>.

  注:必须指定one-to-one标签中的property-ref属性为关系字段的名称。

  六、Hibernate单向一对多关联映射:让一的一端维护关系,和多对一的映射原理是一样的,都是在多的一端加入一个外键指向一的一端;

    区别在于维护的关系不同:

  • 多对一维护的关系:多指向一的关系,如果维护了多指向一的关系,那么加载多的一端的时候会把一的一端加载上来;
  • 一对多维护的关系:一指向多的关系,如果维护了一指向多的关系,那么加载一的一端的时候会把多的一端加载上来。

  比如说一个班里有多名学生。

  1、Classes.java 和 Student.java里各有两个普通属性id和name。在Classes里加入新属性:private Set students;

  2、映射文件的修改:Classes.hbm.xml里除了普通属性,加入集合映射:

  

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

  注1:“一”的一端维护关系。

  注2:session.save(student),session.save(classes),保存student和classes对象。可以成功保存数据,但是需要发出多余的update语句来维持关系。

  下篇博客继续分析。

 

Hibernate的七种映射关系之七种关联映射(一)的更多相关文章

  1. Hibernate的七种映射关系之七种关联映射(二)

    继续上篇博客 七.Hibernate双向一对多关联映射:让多的一端来维护关系. 主要是解决一对多单向关联的缺陷,而不是需求驱动的. 1.在Student.java实体类里添加Classes引用.pri ...

  2. (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射

    http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...

  3. (Hibernate进阶)Hibernate映射——多对一单向关联映射(四)

    介绍基于基本映射的关联关系映射. 概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用. 分类 关联关系分为上述 ...

  4. 【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)

    [SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,採用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...

  5. 【SSH系列】Hibernate映射-- 多对一单向关联映射

    在hibernate中非常重要的就是映射,在前面的博文中,小编简单的介绍了基本映射,基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型 ...

  6. 【Hibernate框架】关联映射(多对多关联映射)

    按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了. 我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以 ...

  7. java之hibernate之基于主键的双向一对一关联映射

    这篇 基于主键的双向一对一关联映射 1.依然考察人和身份证的一对一关系,如果采用主键关联,那么其表结构为: 2.类结构 Person.java public class Person implemen ...

  8. java之hibernate之基于主键的单向一对一关联映射

    这篇讲 基于主键的单向一对一关联映射 1.依然考察人和身份证的一对一关系,如果采用主键关联,那么其表结构应该为: 2.类结构 Person.java public class Person imple ...

  9. java之hibernate之基于外键的双向一对一关联映射

    这篇讲解 基于外键的双向一对一关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 2.类结构 Person.java public class Person implements ...

随机推荐

  1. vi/vim使用进阶: 文件浏览和缓冲区浏览

    原文:https://blog.easwy.com/archives/advanced-vim-skills-netrw-bufexplorer-winmanager-plugin/ 本节所用命令的帮 ...

  2. zmap blacklist

    # From IANA IPv4 Special-Purpose Address Registry# http://www.iana.org/assignments/iana-ipv4-special ...

  3. 3. EM算法-高斯混合模型GMM

    1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-高斯混合模型GMM详细代码实现 5. EM算法-高斯混合模型GMM+Lasso 1. 前言 GM ...

  4. PHP判断ajax请求:HTTP_X_REQUESTED_WITH

    PHP判断ajax请求的原理: 在发送ajax请求的时候,我们可以通过XMLHttpRequest这个对象,创建自定义的 header头信息, 在jquery框架中,对于通过它的$.ajax, $.g ...

  5. C++11中如何输出enum class的值

    Unlike an unscoped enumeration, a scoped enumeration is not implicitly convertible to its integer va ...

  6. C语言 · 3000米排名预测

    算法提高 3000米排名预测   时间限制:1.0s   内存限制:256.0MB      问题描述 3000米长跑时,围观党们兴高采烈地预测着最后的排名.因为他们来自不同的班,对所有运动员不一定都 ...

  7. where子查询

    限定查询(WHERE子句) 之前的查询是将一张表的全部记录查询出来,那么现在如果希望可以根据指定的条件查询的话,则必须指定限定查询. 格式: 的雇员的信息 l  使用“<>”完成 l  S ...

  8. stm32 r8025

    uint8_t RX8025_BCD2DEC(uint8_t val) {     uint8_t i;       i = val&0x0f;           //按位与,i得到低四位数 ...

  9. PAGED_CODE()

    #if DBG #define PAGED_CODE() \ /*APC_LEVEL*/) { \ VideoPortDebugPrint(, "Video: Pageable code c ...

  10. Hbuilder开发app实战-识岁03-文件上传

    前言 做app不得不谈的问题就是文件上传.用hbuilder开发app让上传变的非常easy. Uploader Uploader模块管理网络上传任务,用于从本地上传各种文件到server,并支持跨域 ...