Hibernate的七种映射关系之七种关联映射(一)

  

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

  一、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的七种映射关系之七种关联映射(一),码迷,mamicode.com

时间: 04-26

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

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

继续上篇博客 七.Hibernate双向一对多关联映射:让多的一端来维护关系. 主要是解决一对多单向关联的缺陷,而不是需求驱动的. 1.在Student.java实体类里添加Classes引用.private Classes classes; 2.Student.hbm.xml里添加many-to-one标签:<many-to-one name="classes" column="classesid"/>.Classes.hbm.xml在例子(六)里的那

Hibernate ORM框架——续第二章:Hibernate映射关系:单向关联

一:课堂笔记 **********单表映射*************** 1.只有一个实体类映射一个表 2.有一个实体类+ 一个或者多个值类型,合在一起 映射为一个表 **********多表映射*************** 定义:类有多个映射为多个表 **********数据库层面,如ORM无关************** 2个表之间要建立关系?该如何做?有多少种方法 假定有2个表,分别为A,B 3种关系 a)主键关联:A表的主键对应B表的主键,(一对一的关系) 在数据库种如何建立这种关系?

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

[SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,采用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例(二),小编搭建了基本Hibernate的开发环境,并做了一个简单实例,对它的基本原理有了一个理性的认识. [SSH进阶之路]Hibernate基本映射(三),我们介绍了Hibernate的基本映射(即对一个实体进行映射)的相关概念,并给大家实现相关实例,比较简单. 这篇博客,我们开始介绍基于基本映

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

这篇讲解 基于外键的双向一对一关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 2.类结构 Person.java public class Person implements Serializable{ private int id; private String name; private IdCard idCard; public Person() { } public Person(String name) { super(); this.name = name;

SSH深度历险(一)深入浅出Hibernate架构(一)-------映射解析——七种映射关系

        ORM.全称是(Object Relational Mapping),即对象关系映射.ORM的实现思想就是将关系数据库中表的数据映射成对象.以对象的形式展现.这样开发者就能够把对数据库的操作转化为对这些对象的操作.Hibernate正是实现了这样的思想,达到了方便开发者以面向对象的思想来实现对数据库的操作.    Hibernate在实现ORM功能的时候主要用到的文件有:映射类(*.java).映射文件(*.hbm.xml)和数据库配置文件(*.properties/*.cfg.

Hibernate 的七种映射关系

关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 一.Hibernate多对一关联映射:就是在"多"的一端加外键,指向"一"的一端. 比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系. 1."多"端实体加入引用"一"端实体的变量及getter,setter方法. 比如说多个学生对应一个班级,在学生实体类加入:private Grade grade; 2."多"端配置文

Hibernate映射解析——七种映射关系

        ORM,全称是(Object Relational Mapping),即对象关系映射.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作.Hibernate正是实现了这种思想,达到了方便开发人员以面向对象的思想来实现对数据库的操作.    Hibernate在实现ORM功能的时候主要用到的文件有:映射类(*.java).映射文件(*.hbm.xml)和数据库配置文件(*.properties/*.cfg

Hibernate学习之映射关系

一.Hibernate多对一关联映射:就是在“多”的一端加外键,指向“一”的一端. 比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系. 1.“多”端实体加入引用“一”端实体的变量及getter,setter方法. 比如说多个学生对应一个班级,在学生实体类加入:private Grade grade; 2.“多”端配置文件,student.hbm.xml里的标签设置:<many-to-one name="grade" column="gradeId&qu

SSH框架之Hibernate(1)——映射关系

ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作.Hibernate正是实现了这种思想,达到了方便开发人员以面向对象的思想来实现对数据库的操作. Hibernate在实现ORM功能的时候主要用到的文件有:映射类(*.java).映射文件(*.hbm.xml)和数据库配置文件(*.properties/*.cfg.xml),它们各自的作用如下. 映射类(*.java):它是描述数据库表的结构,表中的字段在类中被描述成属