上篇博文【SSH进阶之路】Hibernate映射——一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指仅仅能从人(Person)这端载入身份证端(IdCard),可是反过来。不能从身份证端载入人得信息。

如图所看到的:

关键原因在于对象模型具有方向性:

单向:一端仅仅能载入还有一端。不能反过来。

双向:两端都能够载入还有一端。

问题来了:怎样我们想从身份证端(IdCard)载入人(Person),怎么办呢?

以下我们開始介绍一对一的双向关联映射。

映射原理

双向关联映射与单向关联映射的原理是一样的,双向关联映射并不影响存储。仅仅影响载入。

所以,双向关联映射和单向关联映射的关系模型是一样的即数据库的表结构是一样的,仅仅是IdCard的实体类和配置文件(IdCard.hbm.xml)发生了一点点变化。

对象模型

从上图中能够看出:

1、一个人仅仅有一张身份证,唯一的一个身份证号,对象之间是一对一的关系。

2、两个对象得关系维护还是由person端决定(由于关系仅仅能由一端维护主键,否则关系就乱了)。

依据上面的对象模型,我们能够看到Person端没有变化。可是要在IdCard端加上Person的引用,比如Person和IdCard实体类例如以下。

Person

package com.liang.hibernate;

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

IdCard

package com.liang.hibernate;

public class IdCard {
private int id;
private String cardNo;
private Person person; public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
}

不管是单向关联映射还是双向关联映射,他们都属于一对一关联映射,仅仅是他们主键的生成策略不同。分为主键关联映射和唯一外键关联映射。

因为它们都属于一对一关联映射,所以,Hibernate封装双向关联映射时。主键关键映射和唯一外键关联映射的载入策略一样,都採用的是一对一<one-to-one name=""></one-to-one>,仅仅是属性设置不一致,所以,以下我们分开来看IdCard的配置文件。

分类:

主键关联映射

同一对一单向关联映射类似,主键关联即利用主键进行关联。关联主键的值同样。以下我们看一下映射文件:

IdCard.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">
<hibernate-mapping package="com.liang.hibernate">
<class name="IdCard" table="t_idCard">
<id name="id">
<generator class="native"></generator>
</id>
<property name="cardNo"></property>
<!-- 怎么载入对象,抓取策略:join联合查询(默认),select:一条条的查询 -->
<one-to-one name="person" class="Person" fetch="join"></one-to-one>
</class>
</hibernate-mapping>

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">
<hibernate-mapping package="com.liang.hibernate">
<class name="Person" table="t_person">
<id name="id">
<!-- 採用foreign生成策略,forgeign会取得关联对象的标识 -->
<generator class="foreign" >
<param name="property">idCard</param>
</generator>
</id>
<property name="name"></property>
<!--
one-to-one指示hibernate怎样载入其关联对象,默认依据主键载入
也就是拿到关系字段值,依据对端的主键来载入关联对象 constrained="true"表示,当前主键(person的主键)还是一个外键
參照了对端的主键(IdCard的主键),也就是会生成外键约束语句
-->
<one-to-one name="idCard" class="IdCard" constrained="true"></one-to-one>
</class>
</hibernate-mapping>

生成的表结构

唯一外键关联映射

一对一双向关联映射的外键关联映射也与一对一单向关联映射的外键关联映射类似,在其一对一的指向端(Person)存在一个唯一外键,该唯一外键与被指向端(IdCard)相关联,关联主键的值同样。以下我们看一下映射文件:

IdCard.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">
<hibernate-mapping package="com.liang.hibernate">
<class name="IdCard" table="t_idCard">
<id name="id">
<generator class="native"></generator>
</id>
<property name="cardNo"></property>
<!-- 一对一唯一外键关联双向採用<one-to-one>标签来映射。必须指定<one-to-one>
标签中的property-ref属性为关系字段的名称
-->
<one-to-one name="person" class="Person" property-ref="idCard"></one-to-one>
</class>
</hibernate-mapping>

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">
<hibernate-mapping package="com.liang.hibernate">
<class name="Person" table="t_person">
<id name="id">
<generator class="native" ></generator>
</id>
<property name="name"></property>
<!-- 因为它是一对一的唯一外键关联,它是多对一关联的特例,凝视能够直接写成多对一关联-->
<!-- idCard属性,表达的是本对象与IdCard的多对一关系。 -->
<many-to-one name="idCard" class="IdCard" column="idCardId" unique="true"></many-to-one>
</class>
</hibernate-mapping>

生成的表结构

对照

一对一单向和双向关联映射的差别正是对象模型和关系模型的差别之中的一个。

对象模型:有方向性。它究竟是单向还是双向是由对象模型决定的即配置文件决定。

关系模型:没有方向性或者说是双向的。从不论什么一端都能够载入还有一端。

下载

以上内容,仅仅证明了一对一双向关联映射不影响存储即没有改变表结构,但不能证明关联是双向的,须要写对应的測试用例,我们以源代码的形式给大家。源代码下载

总结

一对一双向关联映射并非必须的,是由需求下决定的。

假设没有这种需求。用户也没有要求。系统也不须要,就没有必要建立双向的关联映射。

下篇博文。我们介绍多对多单向关联映射。谢谢关注。

【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)的更多相关文章

  1. (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)

    上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...

  2. 【SSH系列】hibernate映射 -- 一对一双向关联映射

    开篇前言 上篇博文[SSH进阶之路]hibernate映射--一对一单向关联映射,小编介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身 ...

  3. Hibernate一对一双向关联映射

    关键原因在于对象模型具有方向性: 单向:一端只能加载另一端,不能反过来. 双向:两端都可以加载另一端. 问题来了:如何我们想从身份证端(IdCard)加载人(Person),怎么办呢? 下面我们开始介 ...

  4. 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

    [SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,採用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...

  5. Hibernate从入门到精通(六)一对一双向关联映射

    在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射,这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映射所不同的的 ...

  6. Hibernate(六)一对一双向关联映射

    在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射, 这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映 射所不同 ...

  7. 【SSH系列】Hibernate映射 -- 一对一单向关联映射

     映射原理       一对一关联映射:两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应.有两种策略可以实现一对一的关联映射:       a.主键关联:即让两个对象具有相 ...

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

    映射原理 两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应.例如:一个人(Person)只有一张身份证(IdCard).我们看一下这个例子的对象模型,如下图所示: 对象模型 ...

  9. Java进阶知识12 Hibernate多对多双向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,老师也知道自己教哪些学生时,可用双向关联 1.2.创建Teacher类和Student类 ...

随机推荐

  1. ny220 推桌子

    推桌子 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 The famous ACM (Advanced Computer Maker) Company has rent ...

  2. 轮询、长轮询、长连接、websocket

    Web端即时通讯技术:即时通讯技术简单的说就是实现这样一种功能:服务器端可以即时地将数据的更新或变化反应到客户端,例如消息即时推送等功能都是通过这种技术实现的.但是在Web中,由于浏览器的限制,实现即 ...

  3. 不同版本Lua介绍

    luainterface.nlua.ulua.unilua.cstolua.slua luainterface:LuaInterface是开源的C#的lua桥接库,配合开源库luanet,能轻松实现L ...

  4. DirectStream、Stream的区别-SparkStreaming源码分析02

    转http://hadoop1989.com/2016/03/15/KafkaStreaming/ 在Spark1.3之前,默认的Spark接收Kafka数据的方式是基于Receiver的,在这之后的 ...

  5. ADO.NET 连接方式进行数据库访问

    转自:http://www.cnblogs.com/oneword/archive/2010/09/10/1823414.html 连接到数据源 连接到数据源需要使用两步: 1.创建连接字符串 2.使 ...

  6. C#中WebBrowser控件的使用

    今天在YouTube上看了一个关于WebBrowser控件用法的小视频,做一下总结. 首先创建一个WinForm程序,拖入一个textbox控件和一个button按钮,然后拖入一个panel控件,如图 ...

  7. Android开发日记(三)

    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentV ...

  8. 面向对象 之 [C++面试题]

    说到面向对象,大家第一反应应该就是它的三大特性:封装性.继承性和多态性.那么我们先简单的了解一下这三大特性: (1)封装性:封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的 ...

  9. c语言实现类似重载的功能

    今天man了一下open,发现open函数的原型居然看着是重载,C语言不是不支持重载么,经过一番搜寻之后,总结如下: 可变长参数函数 C语言是不支持函数重载机制的,但是支持变长参数函数,当然C++也是 ...

  10. 关于Java开发过程中质量提升-1代码格式配置

    在项目开发维护中,编码规范作为开发规范的一个组成部分,是十分重要和必须的,它不仅仅是为了提高开发效率,也有利于降低后期维护开发的成本.编码规范的根本目的就是要让不仅代码可以一目了然,也可以很容易的理解 ...