上篇文章对多对一的关联映射做了具体的分析,它在实现上能够有两种方式,而且这两种方式实现也非常easy,关键是标签<many-to-one>的使用,它分别指明了多端和一端的映射关系。这样的映射关系既是对象模型中的聚合关系。接下来继续讨论关联映射。

一、唯一外键


唯一外键说的是数据库表中的每一行的外键唯一相应着还有一张表中的主键。也就是说一个表的主键作为还有一张表的外键。而且它们之间的关系是唯一的。这样的反应到关系模型中例如以下图所看到的:

上图的两个实体表。分别为人和身份证。非常明显的一个人相应着一个身份证。

身份证作为一个单独的实体表它加入了标识列,并且此标识列是人实体表中的外键先关联。

这样的在实现上类似于上篇文章中讲到的多对一映射,一个表的主键标识列是还有一张表的外键,所在在实现时使用的也应该是<many-to-one>标签,但不同的是这里採用的是唯一相应,此时应该设置其他的属性来做唯一标识。

为了实现一对一的唯一外键映射,这时就必须在<many-to-one>标签中加入上属性unique,也就是指定多的一端的unique值为true,反应到该演示样例中也就是在person的映射文件里设置一个<many-to-one name="idCard">标签,而且标签中须要加入unique="true",所以相应的Person.java的映射文件Person.hbm.xml的代码例如以下:

<?xml version="1.0"?

>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2014-5-15 23:47:00 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.hibernate.Person" table="PERSON">
<id name="id" type="int">
<generator class="native"/>
</id>
<property name="name"></property>
<many-to-one name="idCard" unique="true"></many-to-one>
</class>
</hibernate-mapping>

对照多对一关联映射和一对一唯一外键关联映射。事实上它们两个都是使用了<many-to-one>本质上都是外键约束,仅仅只是一对一的是唯一映射,须要加入unique="true"的属性,其他的它们两个是同样的。

二、主键关联映射

上文讨论了一对一的唯一外键映射,它事实上是多对一关联映射的一种特殊情况,而且在关联映射中会有多种情况。这里再继续讨论关联映射可能的情况。

        在一对一的关联映射中会有一种特殊的情况就是一个表的主键同一时候也是一个表的外键,也就是说一个字段是同是主键和外键。而且该外键唯一相应着还有一张表的一行,它们两个是唯一相应的关系,反应到对象模型中它们之间属于一种一对一的引用关系,一个对象的属性是另外一个对象的属性值,对象模型例如以下图所看到的:

上图的Person类和IdCard类之间是一一相应的关系,一个人就仅仅能有一个身份证,一个身份证仅仅能相应一个人。而且身份证的标识同一时候也是人的标识,它所相应的关系模型也是一种一对一的关系。一张的主键也是这张表的外键。例如以下图所看到的:

T_person表的主键id列同一时候也是T_idCard表的主键标识列,这就构成了外键关系。所以此时它们之间就是一种一对一的主键关联关系。那么反应到Hibernate中是怎样实现的呢?

        Hibernate提供的这样的映射关联中不但有<many-to-one>的关系,另外还提供了<one-to-one>的关系,它既是指一对一的关系。

        在实现时须要将标识字段设置为foreign,并将须要关联的对象的名称作为property參数写入到构造器中,并在最后加入<one-to-one>标签。

详细代码例如以下:

<?xml version="1.0"?

>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2014-5-15 23:47:00 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.hibernate.Person" table="PERSON">
<id name="id" type="int">
<!-- 採用foreign生成策略,foreign会取得关联对象的标识 -->
<generator class="foreign">
<!-- property仅仅关联对象 -->
<param name="property">idCard</param>
</generator>
</id>
<property name="name"></property>
<!--
one-to-one标签指示Hibernate怎样载入其关联对象。默认依据主键载入,也就是拿到关系字段值,依据对端的主键来载入关联对象 constrained=true表示当前主键(person的主键)还是一个外键,參照了对端的主键(IdCard的主键),也就是会生成外键约束语句
-->
<one-to-one name="idCard" constrained="true"></one-to-one> </class>
</hibernate-mapping>

上面的演示样例中的<param name="property">idCard</param>指的是在Person.java中有一个idCard的属性,该属性是Person对象的一个关联对象,所以须要注冊到foreign中,取得关联对象的标识。

另外在<one-to-one>标签中加入了一个属性constrained="true",指示了Person对象的主键同一时候又是一个外键。详细的Person.java中的代码例如以下:

package com.hibernate;

public class Person {

	private IdCard idCard;
public IdCard getIdCard() {
return idCard;
}
public void setIdCard(IdCard idCard) {
this.idCard = idCard;
} private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
} private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

当中的idCard是Person对象的一个属性,所以在一对一主键关联映射时须要加入一个标识列。

结语


上文介绍了两种一对一的映射,而且分别从对象模型和关系模型上进行了讨论,对于唯一外键的映射来说它是多对一映射的一种特殊情况,仅仅须要在<many-to-one>中加入unique唯一键就可以,另外还有唯一主键映射,这样的事实上须要<one-to-one>标签,然后在主键的属性中使用foreign生成策略,并在该映射中加入相应的关联对象。一对一的映射是还有非常多种情况。将会在接下来的文章中讨论。

【Hibernate步步为营】--单向关联一对一映射的更多相关文章

  1. 【Hibernate步步为营】--双向关联一对一映射具体解释(一)

    一对一的映射在对象模型中是常常见到的,为了将对象模型转换为关系模型就必须在映射文件里进行配置,上篇文章讨论了一对一映射的单向关联的情况,重点是<one-to-one>标签的使用,须要在映射 ...

  2. Hibernate 之单向多对一映射及其衍生问题

    由于在数据表之间可以通过外键进行关联,在使用Hibernate操作映射到存在关联关系的数据表的对象时,需要将对象的关联关系与数据表的外键关联进行映射. 首先建立hibernate.cfg.xml和会话 ...

  3. hibernate(六)一对一映射

    关系映射是指对象之间的关系,并不是指数据库的关系,关系映射是解决当对象处于以下关系之一时,数据库表该如何映射的问题 (一)一对一单向外键关联 1.注解方式配置 创建一个Husband类和Wife类 H ...

  4. 【Hibernate步步为营】--多对多映射具体解释

    上篇文章具体讨论了一对多映射,在一对多映射中单向的关联映射会有非常多问题,所以不建议使用假设非要採用一对多的映射的话能够考虑使用双向关联来优化之间的关系,一对多的映射事实上质上是在一的一端使用< ...

  5. hibernate笔记--单向多对一映射方法

    假设我们要建两张表,学生信息表(student)和年级信息表(grade),关系是这样的: 我们可以看出学生表和=年级表是多对一的关系,多个学生会隶属于一个班级,这种关系在hibernate中成为单边 ...

  6. 【Hibernate步步为营】--映射合集汇总

    前几篇文章具体讨论了对象模型到关系模型的转化方法,对映射关系做了具体的了解,Hibernate将对象模型转化为对应的关系模型是通过使用对应的映射来完毕的(相同也能够使用注解),对于对象之间的关系的转化 ...

  7. Hibernate从入门到精通(五)一对一单向关联映射

    上次的博文中Hibernate从入门到精通(四)基本映射我们已经讲解了一下基本映射和相关概念,接下来我们会讲稍微复杂点的映射——关系映射. 关系映射分类 关系映射即在基本映射的基础上处理多个相关对象和 ...

  8. Hibernate(五)一对一单向关联映射

    上次的博文中 Hibernate从入门到精通(四)基本映射我们已经讲解了一下基本映射和相关概念,接下来 我们会讲稍微复杂点的映射——关系映射. 关系映射分类 关系映射即在基本映射的基础上处理 多个相关 ...

  9. [置顶] Hibernate从入门到精通(五)一对一单向关联映射

    上次的博文中Hibernate从入门到精通(四)基本映射我们已经讲解了一下基本映射和相关概念,接下来我们会讲稍微复杂点的映射——关系映射. 关系映射分类 关系映射即在基本映射的基础上处理多个相关对象和 ...

随机推荐

  1. [Database] 列出MSSQL所有数据库名、所有表名、所有字段名

    1.获取所有数据库名 Select Name From Master..SysDatabases order By Name 2.获取所有表名 Select Name From SysObjects ...

  2. 9.18[XJOI] NOIP训练36

    ***在休息了周末两天(好吧其实只有半天),又一次投入了学车的怀抱,重新窝在这个熟悉的机房 今日9.18(今天以后决定不写打卡了) 日常一日总结 一个昏昏欲睡的早晨 打了一套不知道是谁出的题目,空间限 ...

  3. 初探.net framework 下的异步多线程

    初探.net framework 下的异步多线程 目录 1.多线程的出现条件 2.Thread和ThreadPool的相关Api及用法 3.Task和Parallel的相关Api及用法 4.Async ...

  4. javascript中异常处理案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Spring 获取propertise文件中的值

    Spring 获取propertise文件中的值 Spring 获取propertise的方式,除了之前的博文提到的使用@value的注解注入之外,还可以通过编码的方式获取,这里主要说的是要使用Emb ...

  6. outlook导入配置文件

    公司入.离职人员越来越多,所以产生了一个自动化配置邮件的想法 查看了一下资料,outlook有导入配置文件的方法可用. 利用otc工具,打开office2010的安装文件夹,执行setup.exe / ...

  7. Cython入门.VS.C++

    原文链接:http://blog.csdn.net/gzlaiyonghao/article/details/4561611 作者:perrygeo 译者:赖勇浩(http://laiyonghao. ...

  8. 杭电1019 Least Common Multiple【求最小公倍数】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1019 解题思路:lcm(a,b)=a*b/gcd(a,b) 反思:最开始提交的时候WA,以为是溢出了, ...

  9. 【从零开始】【Java】【2】项目最开始都有什么鬼

    闲聊 刨其根知其底. 让我们从一开始就慢嚼细咽. 开始 先来看下项目都有什么: 项目结构图 pom文件图 项目结构 项目=核心代码+依赖管理文件+说明文件+IDE配套文件+外部依赖包: 核心代码:sr ...

  10. JavaScript数组操作函数

    A: 购物车会有这样的情况,购物车是一个数组,每一个商品是一个对象,分别对应一个id,和一个num ,然后改变商品的时候需要和购物车对比,如果购物车中有这个商品的话,就只改变这个商品对应的id的num ...