Hibernate中一对一关联映射共分为两种,一种是一对一主键关联映射,另一种是一对一唯一外键关联映射。下面简单介绍一下这两种关联映射。

一对一主键关联映射

一对一主键关联映射的两个实体有相同的ID。这种映射又分为单向一对一关联主键映射和双向一对一主键关联映射。

单向一对一主键关联映射

实例类图

映射文件IdCard.hbm.xml
  1. <hibernate-mapping>
  2. <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
  3. <id name="id">
  4. <generator class="native"/>
  5. </id>
  6. <property name="cardNo"/>
  7. </class>
  8. </hibernate-mapping>

映射文件Person.hbm.xml

  1. <hibernate-mapping>
  2. <class name="com.bjpowernode.hibernate.Person" table="t_person">
  3. <id name="id">
  4. <!-- 采用foreign生成策略,forgeign会取得关联对象的标识 -->
  5. <generator class="foreign">
  6. <!-- property只关联对象 -->
  7. <param name="property">idCard</param>
  8. </generator>
  9. </id>
  10. <property name="name"/>
  11.  
  12. <one-to-one name="idCard" constrained="true"/>
  13. </class>
  14. </hibernate-mapping>

生成的SQL语句

  1. create table t_idCard (id integer not null auto_increment, cardNo varchar(255), primary key (id))
  2.  
  3. create table t_person (id integer not null, name varchar(255), primary key (id))
  4.  
  5. alter table t_person add index FK785BED803EEB3F3E (id), add constraint FK785BED803EEB3F3E foreign key (id) references t_idCard (id)

表结构如下图:

注意:

保存关系维护端对象,与之对应的对象会同时保存。反之则不行。查询时也只能从关系维护端找到另一个对象,反之则找不到。

双向一对一主键关联映射

实例类图:


映射文件IdCard.hbm.xml
  1. <hibernate-mapping>
  2. <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
  3. <id name="id">
  4. <generator class="native"/>
  5. </id>
  6. <property name="cardNo"/>
  7. <one-to-one name="person"/>
  8. </class>
  9. </hibernate-mapping>

映射文件Person.hbm.xml

  1. <hibernate-mapping>
  2. <class name="com.bjpowernode.hibernate.Person" table="t_person">
  3. <id name="id">
  4. <!-- 采用foreign生成策略,forgeign会取得关联对象的标识 -->
  5. <generator class="foreign">
  6. <!-- property只关联对象 -->
  7. <param name="property">idCard</param>
  8. </generator>
  9. </id>
  10. <property name="name"/>
  11.  
  12. <one-to-one name="idCard" constrained="true"/>
  13. </class>
  14. </hibernate-mapping>

constrained="true表示,当前主键(person的主键)还是一个外键,参照了对端的主键(IdCard的主键),也就是会生成外键约束语句

生成的SQL语句
  1. create table t_idCard (id integer not null auto_increment, cardNo varchar(255), primary key (id))
  2.  
  3. create table t_person (id integer not null, name varchar(255), primary key (id))
  4.  
  5. alter table t_person add index FK785BED803EEB3F3E (id), add constraint FK785BED803EEB3F3E foreign key (id) references t_idCard (id)

表结构如下图:

注意:

双向一对一关联映射的关键点就是one-to-one标签,是它告诉hibernate对象之间是如何关联的。与单向一对一主键关联映射相同的是保存关系维护端对象,与之对应的对象会同时保存。反之则不行。但是查询的时候,双方都能找到对方。

小结
从上面我们可以看到,单向一对一主键关联映射和双向一对一主键关联映射仅查一个one-to-one标签,但它们生成的sql语句却是完全相同的,也就是说one-to-one标签只影响查询,不影响存储。

一对一唯一外键关联映射

单向一对一唯一外键关联映射

实例类图

映射文件IdCard.hbm.xml

  1. <hibernate-mapping>
  2. <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
  3. <id name="id">
  4. <generator class="native"/>
  5. </id>
  6. <property name="cardNo"/>
  7. </class>
  8. </hibernate-mapping>

映射文件Person.hbm.xml

  1. <hibernate-mapping>
  2. <class name="com.bjpowernode.hibernate.Person" table="t_person">
  3. <id name="id">
  4. <generator class="native"/>
  5. </id>
  6. <property name="name"/>
  7. <many-to-one name="idCard" unique="true"/>
  8. </class>
  9. </hibernate-mapping>

使用<many-to-one>标签来映射,指定多的一端unique属性为true,这样就限定了多的一端的多重性为一,实现了一对一,其实它是多对一的特例。

双向一对一唯一外键关联

实例类图



映射文件IdCard.hbm.xml

  1. <hibernate-mapping>
  2. <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
  3. <id name="id">
  4. <generator class="native"/>
  5. </id>
  6. <property name="cardNo"/>
  7. <one-to-one name="person" property-ref="idCard"/>
  8. </class>
  9. </hibernate-mapping>

映射文件Person.hbm.xml

  1. <hibernate-mapping>
  2. <class name="com.bjpowernode.hibernate.Person" table="t_person">
  3. <id name="id">
  4. <generator class="native"/>
  5. </id>
  6. <property name="name"/>
  7. <many-to-one name="idCard" unique="true"/>
  8. </class>
  9. </hibernate-mapping>

一对一唯一外键关联映射生成的sql语句

  1. create table t_idCard (id integer not null auto_increment, cardNo varchar(255), primary key (id))
  2.  
  3. create table t_person (id integer not null auto_increment, name varchar(255), idCard integer unique, primary key (id))
  4.  
  5. alter table t_person add index FK785BED80F7C7B4CE (idCard), add constraint FK785BED80F7C7B4CE foreign key (idCard) references t_idCard (id)

表结构



注意:
单向一对一唯一外键关联映射和双向一对一唯一外键关联映射生成的sql语句完全相同,区别同上边的一样。

Hibernate之一对一关联映射的更多相关文章

  1. Hibernate中一对一关联映射/组件映射

    Hibernate映射:一对一关联 1.按照外键映射 2.按照主键映射 组件映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映射方式分别 ...

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

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

  3. 【学习笔记】Hibernate 一对一关联映射 组件映射 二级缓存 集合缓存

    啊讲道理放假这十天不到啊 感觉生活中充满了绝望 这就又开学了 好吧好吧继续学习笔记?还是什么的 一对一关联映射 这次我们仍然准备了两个表 一个是用户表Users 一个是档案表Resume 他们的关系是 ...

  4. Hibernate 一对一关联映射,mappedBy参数解析

    在最近java,SSH框架的学习中遇到了这样的一个问题,在Hibernate的开发中一对一关联映射的单向关联,主表会在次表新增一列次表的主键如下图,但是在双向关联中次表不会在表中创建主表的主键一列,这 ...

  5. Hibernate 性能优化一对一关联映射

    概述: hibernate提供了两种映射一对一关联的方式:按照外键映射和按照主键映射. 下面以员工账号和员工档案为例 ,介绍两种映射方式,并使用这两种映射方式分别完成以下持久化操作: (1)保存员工档 ...

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

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

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

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

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

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

  9. Hibernate之1-N关联映射

    一.Hibernate之1-N关联映射 1. 哪边是 1 , 哪边是多 ?      须要从业务的角度来说明.比如,Employee 和 Department 之间就是 n-1 的关联关系,Order ...

随机推荐

  1. Python网络模块Paramiko基本使用

    一.Paramiko简介 首先来看谁创造了paramiko,是一个名叫Jeff Forcier创建了paramiko项目.项目主页:http://www.paramiko.org,可以去看上面有很多相 ...

  2. 在ASP.NET中实现图片、视频文件上传方式

    一.图片 1.在前端用<asp:FileUpload ID="UpImgName" runat="server"/>控件 2.在后台.cs中写上 p ...

  3. MySQL笔记(三)之数据插入更新与删除

    INSERT INTO INSERT INTO 语句用于向表格中插入新的行. 语法: INSERT INTO 表 VALUES (值1, 值2,....) # 列数必须和值的个数匹配 INSERT I ...

  4. 【BFS】【枚举】HihoCoder - 1251 - The 2015 ACM-ICPC Asia Beijing Regional Contest - C - Today Is a Rainy Day

    题意:给你两个只由1~6组成的串,问你B串至少要经过几次操作变成A串. 一次操作要么选择一个种类的数,将其全部变成另一种类:要么选择一个数,将其变为另一个数. 可以证明,一定先进行一定数量的第一种操作 ...

  5. 【动态规划/多重背包问题】POJ2392-Space Elevator

    方法同POJ1014-Dividing,唯一不同点在于每一种block有最大限定高度a,故要以a为关键字进行排序,使得最大高度小的在前,否则最大高度小的再后可能放不上去. #include<io ...

  6. 执行时间 Exercise07_16

    import java.util.Arrays; import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:执行时间 * */ pu ...

  7. 类方法load和initialize的区别

    1.+load方法当类或分类添加到object-c runtime时被调用,子类的+load方法会在它所有父类的+load方法之后执行,而分类的+load方法会在它的主类的+load方法之后执行.但不 ...

  8. 桥接模式:探索JDBC的接口

    目录概要 场景问题 假设要设计一个电脑商场管理系统的某个模块设计,电脑分为品牌和类型两个纬度,我们应该怎么解决?我们初学者最容易想到的办法就是利用继承的方式,那利用继承实现的类图又是什么样子呢?我们看 ...

  9. 利用BusyBox ~私人定制 My LINUX~

    前言 我在今天在这里跟大家详细地探讨一下Linux系统的定制过程和实现例如.用户能够远程登录:和Nginx能够稳定地运行在我们私人定制的LINUX系统上.一步一步从头开始定制属于我们自己的系统. 正文 ...

  10. busdog is a filter driver for MS Windows (XP and above) to sniff USB traffic.

    https://code.google.com/p/busdog/ busdog is a filter driver for MS Windows (XP and above) to sniff U ...