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

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

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

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

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. 以xml的方式实现动画

    1.java代码 package com.example.tweenanim; import android.os.Bundle; import android.app.Activity; impor ...

  2. Javascript DOM 02 在<ul>中创建、删除 <li>

    创建DOM元素 createElement(标签名)  创建一个节点 appendChild(节点)  追加一个节点 例子:为ul插入li 插入元素 insertBefore(节点, 原有节点)  在 ...

  3. vim打开文件时显示行号

    vim打开文件是,默认不提示行号. 至于显示行号的用途,因人而异 linux下一个主机可能有N个账户.对于配置分为两种:仅配置当前账户,配置所有账户 vim配置文件路径(Centos  5.5 fin ...

  4. c语言利用指针计算字符串的长度

    可以用strlen函数,这里我们自己写一个. 注意:不能用scanf,scanf一遇到空格就认为输入结束.应该用gets(),遇到换行符或EOF结束.说明可以接受空格. #include<cst ...

  5. 【Cocos2d-x】截图分享功能

    Cocos2d-x截图实现 图片将会保存在data/data/包名/files文件夹下. Android下分享一张图片 linux系统下的文件权限 普通情况下android下的每个应用程序都是一个独立 ...

  6. SPField的GetValidatedString方法没有被调用

    当我们开发自定义类型的Field时,可能会用到GetValidatedString这个方法. 但是有时候这个方法并没被调用 原因是: 当Field的Value为null时,该方法不会被调用 解决办法: ...

  7. 【linux驱动笔记】字符设备驱动相关数据结构与算法

    欢迎转载,转载时需保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...

  8. Flash, Flex, Air, Flashplayer之间的相互关系是什么?

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:曾嵘链接:http://www.zhihu.com/question/20001256/answer/15565376来源:知 ...

  9. int 转换成 CString(VC2008里有这个问题)

    int s = 123; CString str; str.Format("%d",s); 这样就可以了,但是有的会提示这个错误 如果出现这个错误,就改成下面这个就OK了:  st ...

  10. use EXPORT和use EXPORT_OK

    我不明白 use EXPORT和use EXPORT_OK的区别,大多数资料提到了一些: @Export 允许 导出模块的函数和变量到用户的名字空间使用标准的导入方法. 这种方式,我们不需要创建模块的 ...