前面两篇介绍了多对一、一对多的映射。今天分享下一对一的关联映射关系。有两种策略可以实现一对一的关联映射:主键关联、唯一外键关联。

主键关联——两个表有完全相同的主键值,来表示它们的一对一的关系。数据库中没有额外的字段去维护它们之间的关系,就只是靠着主键来维持关系。

唯一外键关联——增加一个额外的字段,维护他们之间的一对一关系。

现在要用一对一来描述人和身份证的关系。每个人只有一个身份证。

1、单向主键关联进行描述

根据上图,我们需要在person端进行如下配置:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.lzq.hibernate.Person" table="t_person">
<id name="id">
<!--采用foreign生成策略,foreign会取得关联对象的标识-->
<generator class="foreign">
<!--property只关联对象-->
<param name="property">idCard</param>
</generator>
</id>
<property name="name" />
<!--
one-to-one指示hibernate如何加载其关联对象,默认根据主键加载
也就是拿到关系字段值,根据对端的主键来加载关联对象
-->
<one-to-one name="idCard" constrained="true"></one-to-one>
</class>
</hibernate-mapping>

主键生成策略使用foreign,它能够取得关联对象的标识。上面代码中“constrained='true'”表示当前主键(person的主键)还是一个外键,参照了对端的主键(IdCard的主键),也就是会生成外键约束语句。

2、单向唯一外键关联

根据上图,我们需要对Person进行如下配置:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.lzq.hibernate.Person" table="t_person">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<!-- 用多对一的配置+唯一的限制,来表示一对一的关联关系-->
 <many-to-one name="idCard" unique="true" />
</class>
</hibernate-mapping>

唯一外键关联的主键生成策略不像主键关联那样必须使用foreign外键生成策略,这里采用的是native。另外一对一的关系采用多对一的配置+唯一的限制,来表示一对一的关联关系。

3、双向主键关联进行描述

该种情况,我们仍然在Person端维护关系字段,而且不能够在IdCard再维护关系。如果在IdCard端也维护关系,两段都维护主键,那么就会产生混乱。所以,此处的双向,我们单只加载的时候,也可以从IdCard方加载上来。

在双向关系中,还需要将关系配置在IdCard中,对IdCard进行如下配置:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.lzq.hibernate.IdCard" table="t_id_card">
<id name="id">
<generator class="native" />
</id>
<property name="cardNo" />
<!-- 这是默认情况:由于抓去策略不同,只显示一条sql语句
<one-to-one name="person" fetch="join"></one-to-one>
-->
<!--
由于抓去策略不同,显示两条sql语句:
第一条查询身份证,第二条查询人
-->
<one-to-one name="person" fetch="select"></one-to-one>
</class>
</hibernate-mapping>

双向一对一主键关联映射需要在IdCard加入<one-to-one>标签,指是hibernate将关联对象Person根据主键加载上来。


4、双向唯一外键关联描述

此处的双向同上面提到的双向的概念一致,关系还是只是Person端维护,这里双向只是指从IdCard端能够加载上来。

IdCard端关系:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.lzq.hibernate.IdCard" table="t_id_card">
<id name="id">
<generator class="native" />
</id>
<property name="cardNo" />
<one-to-one name="person" property-ref="idCard"></one-to-one>
</class>
</hibernate-mapping>

一对一双向外键关联采用<one-to-one>标签映射,必须执行该标签中的property-ref属性为关系字段的名称。

一对一的关联映射,经常使用的还是单向唯一外键关联。主键关联的方式扩展性不好,而且不太灵活。两种方式的区别在文章开头也有提到,映射方式肯定是不同的,另外在数据库表也有不同,主键关联的方式不会使用额外的字段来维护关系,而唯一外键关联方式需要在一端使用额外的字段维护关系。

Hibernate(五)——经典解析一对一关联映射的更多相关文章

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

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

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

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

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

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

  4. Hibernate之一对一关联映射

    Hibernate中一对一关联映射共分为两种,一种是一对一主键关联映射,另一种是一对一唯一外键关联映射.下面简单介绍一下这两种关联映射. 一对一主键关联映射 一对一主键关联映射的两个实体有相同的ID. ...

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

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

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

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

  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. BZOJ 2875: [Noi2012]随机数生成器( 矩阵快速幂 )

    矩阵快速幂...+快速乘就OK了 ----------------------------------------------------------------------------------- ...

  2. BZOJ 1578: [Usaco2009 Feb]Stock Market 股票市场( 背包dp )

    我们假设每天买完第二天就卖掉( 不卖出也可以看作是卖出后再买入 ), 这样就是变成了一个完全背包问题了, 股票价格为体积, 第二天的股票价格 - 今天股票价格为价值.... 然后就一天一天dp... ...

  3. BZOJ 3211: 花神游历各国( 线段树 )

    线段树...区间开方...明显是要处理到叶节点的 之前在CF做过道区间取模...差不多, 只有开方, 那么每个数开方次数也是有限的(0,1时就会停止), 最大的数10^9开方10+次也就不会动了.那么 ...

  4. awk内置变量 awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。

    ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FILENAME awk浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符,等价于命令行 ...

  5. 01-OC介绍

    目录 一.OC语言介绍 二.ios系统 三.在OC语言开发中使用C语言语法 四.面向对象 回到顶部 一.OC语言介绍 1 早在20世纪80年代早期,BardCox发明了Objective-C,扩充了C ...

  6. Matlab中.*和./详解

    1.概念 .*和./用于矩阵相乘或者矩阵相除,分别表示矩阵中对应元素相乘和对应元素相除. 2.实例:

  7. jquery Deferred使用经验

    这周做了个小活动(http://aoqi.100bt.com/zt-2016duanzi/index.html),刚开始时候没看好需求,逻辑都写一块了 最后各种坑要填补,从中也获取了些经验和教训,下面 ...

  8. 总结NHibernate 中删除数据的几种方法

    今天下午有人在QQ群上问在NHibernate上如何根据条件删除多条数据,于是我自己就写了些测试代码,并总结了一下NHibernate中删除数据的方式,做个备忘.不过不能保证囊括所有的方式,如果还有别 ...

  9. android 播放音乐-进度条

    今天学渣研究了一下使用MediaPlayer播放音乐时加入进度条,进度条如今用的是android自带的seekbar,后期会跟换UI的,在之前可以播放音乐的基础上,如今加入的主要功能有两个: 1实时显 ...

  10. Swift - 实现拨打电话

    要实现打电话功能,最简单最直接的方式便是:直接跳到拨号界面 (注意:这个需要真机调试,模拟器无效果) 1 2 //自动打开拨号页面并自动拨打电话 UIApplication.sharedApplica ...