映射原理
       一对一关联映射:两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应。有两种策略可以实现一对一的关联映射:
       a、主键关联:即让两个对象具有相同的主键值,以表明她们之间的一一对应的关系;数据库表不会有额外的字段来维护她们之间的关系,仅通过表的主键来关联。
       b、唯一外键关联:外键关联,本来适用于多对一的配置,但是如果加上唯一的限制之后,也可以表示一对一关联关系,谈恋爱就是一一对应,一个男朋友对应一个女朋友,如果不是,只能说明道德问题,ok,再比如,我们每个人(person)只能有一张身份证(IdCard),不需要多余的外键字段来维护关系,仅通过主键来关联,即Person的主键要依赖IdCard的主键,他们共用一个主键值。接着,小编就person和idCard为例,讲解两种策略实现一对一的关联映射。不足之处,还请小伙伴们多多指教`(*∩_∩*)′。
      小编依然从uml图入手,了解她们的对象模型和关系模型,首先我们来看一对一的对象模型,类图如下所示:
                            

从上面的uml类图包括实际生活中,我们很容易得出结论,一个人只有一张身份证,并且我们的身份证号码都是唯一的,因为我们每个人都是独一无二的Person和IdCard之间是一一对一的关系,Person持有IdCard的引用,所以,两个对象关系维护由Person端来决定。ok,接下来,小编分别讲解一对一单向关联映射的两种策略。

        主键关联
        根据上面的对象模型,我们画出下面的关系模型,如下所示:
              

在博文的开头,小编已经介绍过,主键关联,即让两个对象具有相同的主键值,以表明她们之间的一一对应的关系;数据库表不会有额外的字段来维护她们之间的关系,仅通过表的主键来关联。结合我们person和idCard的例子,就是Person的主键要依赖IdCard的主键,他们共用一个主键值。 ok,接着,我们开始编写相应的代码。

第一步、建立项目,编写Pserson和Person两个实体类,并且生成get和set方法代码如下所示,首先是Person类:

package com.bjpowernode.hibernate;

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

}

接着IdCard类,代码如下所示:

package com.bjpowernode.hibernate;

public class IdCard {

	private int id;
	private String cardNo;
	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;
	}

}

第二步、编写Person.hbm.xml和IdCard.hbm.xml文件中的代码,首先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>
	<class name="com.bjpowernode.hibernate.Person" table="t_person">
		<id name="id">
			<!-- 采用foreign生成策略,forgeign会取得关联对象的标识 -->
			<generator class="foreign">
				<!-- property只关联对象 -->
				<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name"/>
		<!--
			one-to-one指示hibernate如何加载其关联对象,默认根据主键加载
			也就是拿到关系字段值,根据对端的主键来加载关联对象

			constrained="true表示,当前主键(person的主键)还是一个外键
			参照了对端的主键(IdCard的主键),也就是会生成外键约束语句
		 -->
		<one-to-one name="idCard" constrained="true"/>
	</class>
</hibernate-mapping>

接着编写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>
    <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
    	<id name ="id">
    		<generator class="native"/>
    	</id>
    		<property name="cardNo"/>
    </class>  

</hibernate-mapping>

第三步、编写hibernate.cfg.xml的代码,建立数据库并且添加相应的映射,代码如下所示:

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory >
		<!-- MySql数据库驱动 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- 数据库名称 -->
		<property name="hibernate.connection.url"> jdbc:mysql:///hibernate_one2one_pk_1</property>
		<!-- 数据库的用户名 -->
		<property name="hibernate.connection.username">root</property>
		<!-- 数据库的密码 -->
		<property name="hibernate.connection.password">123456</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- 显示语句 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 格式排版 -->
        <!-- <property name="hibernate.format_sql">true</property> -->    

		<mapping resource="com/bjpowernode/hibernate/Person.hbm.xml"/>
		<mapping resource="com/bjpowernode/hibernate/IdCard.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

接着,创建数据库,并且运行ExportDB,效果如下所示:

ok,数据库已经建立好了,相应的表也已经生成,现在小编来编写相应的方法,向数据库中插入数据,运行效果如下所示:

唯一外键关联

上面介绍的是主键关联,小编开始介绍第二种唯一外键关联,根据上面的对象模型,关系模型如下所示:

        我们依旧以上面的代码为例,相同的部分,小编就不再赘述了,IdCard.hbm.xml里面的内容不用变,ok接着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>
	<class name="com.bjpowernode.hibernate.Person" table="t_person">
		<id name="id">
			<!-- 采用foreign生成策略,forgeign会取得关联对象的标识 -->
			<generator class="foreign">
				<!-- property只关联对象 -->
				<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name"/>

	 <many-to-one name="idCard" unique="true"/>

	</class>
</hibernate-mapping>

接着创建数据库,并且运行ExportDB,数据库已经建立好了,相应的表也已经生成,现在小编来编写相应的方法,向数据库中插入数据,运行效果如下所示:

       小编寄语:该博文,小编主要介绍了一对一单向关联映射,分别介绍了主键关联和唯一外键关联,配之demo进行讲解,但是一对一有两个缺点,灵活性较差,没有办法改成多对一关联映射,不能灵活应对千变万化的需求,必须先保存关联对象IdCard,之后才能保持Person;所以,在映射一对一单向关联映射时,我们通常唯一外键关联映射,在下篇博文中,小编将继续介绍hibernate中的映射,一对一双向关联映射,精彩未完待续……

【SSH系列】Hibernate映射 -- 一对一单向关联映射的更多相关文章

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

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

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

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

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

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

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

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

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

    这篇讲解基于外键的一对一单向关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 注意:基于外键的一对一关联的表结构和多对一的表结构是一致的,但是,外键是唯一的. 2.类的结构 Pe ...

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

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

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

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

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

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

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

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

随机推荐

  1. CodeForces 909E Coprocessor(无脑拓扑排序)

    You are given a program you want to execute as a set of tasks organized in a dependency graph. The d ...

  2. Jenkins配置Gogs webhook插件

    前言 我们在前面使用Jenkins集合Gogs来进行持续集成的时候,选择的是Jenkins定时检测git仓库是否有更新来决定是否构建.也就是说,我们提交了代码Jenkins并不会马上知道,那么我们可以 ...

  3. 部署上次的Hapi到Windows+Docker,WindowsDocker

    前言: 理论的就不多说了,具体的架构看图.web这里是上篇文章开发的Hapi服务,数据库Mysql,废话不多说,粗略的画了下,架构图如下: Mysql镜像拉取,配置 数据库镜像查找 docker se ...

  4. Python系列之 - python数据类型

    原链接:https://blog.csdn.net/m0_37745438/article/details/79572884 学习一门语言,往往都是从Hello World开始. 但是笔者认为,在一个 ...

  5. javaApplication中如何使用log4j

  6. ftp爆破(python脚本)

    最近在乌云看到一份端口详解:为了锻炼自己,按照端口详解写脚本 #!/usr/local/bin/ python #-*- coding: UTF-8 -*- __author__ = '' from ...

  7. [自用]多项式类数学相关(定理&证明&板子)

    写在前面 由于上一篇总结的版面限制,特开此文来记录 \(OI\) 中多项式类数学相关的问题. 该文启发于Miskcoo的博客,甚至一些地方直接引用,在此特别说明:若文章中出现错误,烦请告知. 感谢你的 ...

  8. [SCOI 2010]字符串

    Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgw ...

  9. [SCOI2014]方伯伯的玉米田

    Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...

  10. ●BZOJ 2209 [Jsoi2011]括号序列

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2209 题解: Splay 很好的题,但是把智障的我给恶心到了...   首先不难发现,最后没 ...