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

【SSH进阶之路】Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,采用对象化的思维操作关系型数据库。

【SSH进阶之路】Hibernate搭建开发环境+简单实例(二),小编搭建了基本Hibernate的开发环境,并做了一个简单实例,对它的基本原理有了一个理性的认识。

【SSH进阶之路】Hibernate基本映射(三),我们介绍了Hibernate的基本映射(即对一个实体进行映射)的相关概念,并给大家实现相关实例,比较简单。

【SSH进阶之路】Hibernate映射——多对一单向关联映射(四),我们介绍了多对一的关联映射,并详细了解说了,映射技巧,这篇我们依旧使用此映射技巧,帮助大家更好的理解。

下面开始今天的愉快之旅。

映射原理

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

对象模型

从上图中可以看出:

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

2、人(Person)持有身份证(IdCard)的引用,所以,两个对象关系维护由person端决定。

从对象模型映射成关系模型,有两种方式:主键关联和唯一外键关联,我们继续看下面的内容。

分类:

主键关联:

1、两个实体对象的主键一样,以表明它们之间的一一对应关系;

2、不需要多余的外键字段来维护关系,仅通过主键来关联,即Person的主键要依赖IdCard的主键,他们共用一个主键值。

以上两点恰与唯一外键关联相反。

 主键关联的关系模型

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的主键),也就是会生成外键约束语句
		 -->
		 <!-- idCard属性,表达的是本对象与IdCard的一对一关系。 -->
		<one-to-one name="idCard" class="IdCard"  constrained="true"></one-to-one>
	</class>
</hibernate-mapping>

生成的表结构以及测试数据:

唯一外键关联:

1、两个实体对象用一个外键来关联,以表表明对象之间的关系。

2、其实它是多对一关联映射的特例,多的一端加上唯一的限制之后,用来表示一对一的关联关系。

所以它采用多对一的标签来映射,如下所示:

<!-- 采用<mang-to-one>标签来映射,指定多的一端unique为true,
	这样就限制了多的一端的多重性为一,就是这样来映射的。
-->
<many-to-one name="" unique="true"></many-to-one>

唯一外键的关系模型

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>

生成的表结构以及测试数据:

其他相同代码如下:

Person

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

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;
	}
}

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>
	</class>
</hibernate-mapping>

建议

由于一对一主键关联映射具有以下两个缺点:

1、灵活性差,没有办法改成多对一关联映射,不能应变多变的需求;

2、必须先保存关联对象IdCard,之后才能保持Person;

所以,在映射一对一单向关联映射时,我们采用唯一外键关联映射。

下篇博文,我们介绍一对一双向关联映射,谢谢关注。

时间: 2024-10-01 06:19:59

【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)的相关文章

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

上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向:一端只能加载另一端,不能反过来. 双向:两端都可以加载另一端. 问题来了:如何我们想从身份证端(IdCard)加载人(Person),怎么办呢? 下面我们开始介绍一对一的双向关联映射. 映射原理 双向关联映射与单向关联映射的原理是一

【SSH进阶之路】Hibernate映射——一对多关联映射(七)

上上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息. 上篇博文[SSH进阶之路]Hibernate映射--一对一双向关联映射(六),双向关联映射解决了单向关联映射只能从一端加载信息的缺陷,当然,双向关联映射并不影响存储,只影响加载.下面我们开始今天的内容: 一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,

【SSH进阶之路】Hibernate系列——总结篇(九)

这篇博文是Hibernate系列的最后一篇,既然是最后一篇,我们就应该进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通. 概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我们也说它是数据持久层的框架. 我们从上一句话可以看出Hibernate的核心:面向对象.关系映射以及数据持久化.前面两个概念很容易理解,而对于"数据持久化",就是将数据或者某物体,永久的保存起来.现实生活中的例子有很多,例如:鲜肉冷藏,水果做成罐头,而对于编程而言就是将数据保存在文件或磁盘

Hibernate一对一双向关联映射

关键原因在于对象模型具有方向性: 单向:一端只能加载另一端,不能反过来. 双向:两端都可以加载另一端. 问题来了:如何我们想从身份证端(IdCard)加载人(Person),怎么办呢? 下面我们开始介绍一对一的双向关联映射. 映射原理 双向关联映射与单向关联映射的原理是一样的,双向关联映射并不影响存储,只影响加载.所以,双向关联映射和单向关联映射的关系模型是一样的即数据库的表结构是一样的,只是IdCard的实体类和配置文件(IdCard.hbm.xml)发生了一点点变化. 对象模型 从上图中可以

【SSH系列】Hibernate映射 -- 一对多关联映射

    映射原理       一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入一个外键,指向一的一段,关联关系都是在多的一端进行维护,只是我们在写映射的时候发生了变化.       一对多和多对一的映射原理是一样的,但是她们之间也存在着小小的区别,毕竟世界上没有两片完全相同的叶子,她们之间的区别就是维护的关系不同,我们先来看多对一,多端维护一端的关系,在加载多端的时候,可以将一端

【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)

[SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,采用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例(二),小编搭建了基本Hibernate的开发环境,并做了一个简单实例,对它的基本原理有了一个理性的认识. [SSH进阶之路]Hibernate基本映射(三),我们介绍了Hibernate的基本映射(即对一个实体进行映射)的相关概念,并给大家实现相关实例,比较简单. 这篇博客,我们开始介绍基于基本映

【SSH进阶之路】Hibernate映射——多对多关联映射(八)

上篇博文[SSH进阶之路]Hibernate映射--一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数据冗余的问题. 举例 一个用户(User)对多个角色(Role),一个角色对多个用户. 分类 单向的多对多关联映射(单向User--->Role) 对象模型 关系模型 实例

【SSH进阶之路】Hibernate基本映射(三)

[SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,采用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例(二),小编搭建了基本Hibernate的开发环境,并做了一个简单实例,对它的基本原理有了一个理性的认识. 这篇博客小编介绍Hibernate的经典内容:对象关系映射.主要介绍映射的基本概念,映射的分类,映射文件. 概念 ORM(Object Relational Mapping),即对象关系映射.

【Hibernate步步为营】--单向关联一对一映射(一)

上篇文章对多对一的关联映射做了详细的分析,它在实现上可以有两种方式,并且这两种方式实现也很简单,关键是标签<many-to-one>的使用,它分别指明了多端和一端的映射关系,这种映射关系既是对象模型中的聚合关系.接下来继续讨论关联映射. 一.唯一外键 唯一外键说的是数据库表中的每一行的外键唯一对应着另一张表中的主键,也就是说一个表的主键作为另一张表的外键,并且它们之间的关系是唯一的,这种反应到关系模型中如下图所示: 上图的两个实体表,分别为人和身份证,很明显的一个人对应着一个身份证.身份证作为