【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;
所以,在映射一对一单向关联映射时,我们采用唯一外键关联映射。
下篇博文,我们介绍一对一双向关联映射,谢谢关注。
转载于:https://www.cnblogs.com/ainima/p/6330986.html
【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)相关推荐
- java之hibernate之基于外键的一对一单向关联映射
这篇讲解基于外键的一对一单向关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 注意:基于外键的一对一关联的表结构和多对一的表结构是一致的,但是,外键是唯一的. 2.类的结构 Pe ...
- 【SSH系列】Hibernate映射 -- 一对多关联映射
映射原理 一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入 ...
- 【SSH进阶之路】Hibernate基本映射(三)
[SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,采用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...
- [置顶] Hibernate从入门到精通(十)多对多单向关联映射
上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...
- Hibernate从入门到精通(十)多对多单向关联映射
上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...
- Hibernate一对多单向关联和双向关联映射方法及其优缺点
一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同. 它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的 ...
- 【SSH进阶之路】一步步重构MVC实现Struts框架——封装业务逻辑和跳转路径(四)...
目录: [SSH进阶之路]Struts基本原理 + 实现简单登录(二) [SSH进阶之路]一步步重构MVC实现Struts框架--从一个简单MVC开始(三) [SSH进阶之路]一步步重构MVC实现St ...
- hibernate之多对多关联映射
hibernate之多对多关联映射 转载于:https://www.cnblogs.com/liuyang-1037/archive/2009/06/06/1497589.html
- 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)
Long Long ago.就听说过SSH.起初还以为是一个东东,详细内容更是不详,总认为高端大气上档次,经过学习之后才发现,不不过高大上,更是低调奢华有内涵,经过一段时间的研究和学习SSH框架的基本 ...
最新文章
- 设计模式之迭代器模式(Iterator)摘录
- 基于.htaccess的Web Shell工具htshells
- 织梦lamp环境搭建
- Mistakes(Updating)
- c语言与硬件连接案例,实际LED硬件连接
- 矩阵求导术(上、下)
- 使用webpack4搭建一个基于Vue的组件库
- JDBC入门(4)--- 批处理
- N76E003 工程创建教程
- Focal Loss 的Pytorch 实现以及实验
- 一文看懂什么是MQ消息队列
- ReflectedSchemas应该定期清理否则会占用大量C盘空间
- 想学习C++,C++的未来怎么样?
- Spring学习手札(二)面向切面编程AOP
- Plastic SCM2022版开源项目
- 【c++】设计一个立方体类Box,它能计算并输出立方体的体积和表面积。
- python爬虫实例之一
- LeetCode 一题多解 | 53. 最大子数组和:五种解法完全手册
- 调用支付宝转账接口(单笔)
- mysql组复制(MGR)——背景
热门文章
- 基于Google测试框架实现自己的测试框架
- zip解压mysql安装图解_Mysql安装教程-zip格式压缩包
- 沙老师的作业系列——Crudd‘s Crack Head
- java doc说明书_JAVADOC 常见使用方法 帮助文档
- java如何实现乌龟爬行_乌龟是怎样爬行的
- Android内核和Linux内核的区别
- 12.2.12 创建有响应的用户界面 捕获异常
- psql+加载mysql数据库_Go实战--go语言操作PostgreSQL数据库(github.com/lib/pq)
- 学习记录1-python图片分割transforms方法
- Java Hessian小试(转)