初识Hibernate之关联映射(二)百度_合作
来源:互联网 发布:太原java薪资待遇如何 编辑:程序博客网 时间:2024/05/20 14:27
上篇我们介绍了关联映射的几种形式,有单向多对一,单向一对多,还有双向一对多。本篇接着介绍有关关联映射的其他几种映射方式,主要有以下几种:
- 基于外键的单向一对一关联映射
- 基于主键的单向一对一关联映射
- 单向多对多关联映射
一、基于外键的单向一对一关联映射
具有一对一关联的表结构也是很常见的,比如:一个人对应于一张身份证。于是我们的person表会有一个外键关联到 idcard表的主键,只要这个外键列唯一即可保证person到idcard表的关系由多对一变为一对一,也就是说单向的一对一关联映射其实上也就是外键列唯一的多对一的关联映射。例如:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
我们可以看到,几乎所有的代码和多对一关联映射都是差不多的,只不过在 many-to-one 元素中指定 unique=”true”,原来可以有多个具有相同外键值的记录映射到一的一端,现在指定外键值唯一之后,产生了唯一的一对一的关联映射。下面看看我们的测试代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
我们分别创建两端的一个实例对象,然后由person端维护这种关联关系并将数据插入到数据库。看一眼结果:
这就是基于外键的单向一对一关联映射,与多对一的映射的唯一区别就在于,通过指定外键列唯一来让多的一端唯一,从而形成这种一对一的映射关系。
二、基于主键的单向一对一关联映射
所谓基于主键的映射就是指,其中的一张表的主键值依赖于另一张表的主键值。还是我们的人和身份证模型:
像这种IDCard表完全可以作为属性字段追加到person表的后面的情况(主键重复可覆盖),我们叫这种关联映射为基于主键的一对一关联映射。看看配置文件:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
可以看到,主要的变化还是在于实体类person。首先我们指定他的主键不再自增,而是由外键约束到其他表,对应的其他表的类型则是自己实体类的idCard属性对应的表。one-to-one标签则配置了person类中的IdCard属性,便于我们在取数据的时候Hibernate填充数据到该属性中。下面我们添加数据到数据库中,通过查看输出的Sql语句了解Hibernate是如何为我们创建关联的。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
显然,我们对于idcard表的主键指定了native自增,而对于person表的主键并没有指定自增,person表的主键依赖于idcard的主键。我们并不用指定person表的主键值,因为person会根据和自己关联的idcard表的主键来为自己的主键赋值。
三、单向多对多关联映射
多对多的表关联类型也是非常常见的,例如:
很常见的一个例子,一个学生可以有多个老师,同时一个老师也可以有多个学生,那么这就是很明显的多对多的关联映射。针对这种情况,一般来说数据库的表可以设计如下:
但是这种的表结构设计将会直接导致student表大量冗余,虽然解决了这种多对多的表级关联,但是存在大量冗余。Hibernate中处理这种多对多的关联关系是通过引入另一张表来实现对两个表主键的关联进而关联了两张表。
Student表和teacher表之间的多对多关联完全由connect表进行体现,各自表中数据不再大量冗余,这才是一种比较清晰的表结构设计。下面我们看代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
这是两张表对应的实体类,下面我们主要看映射文件的配置。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
Teacher实体类的配置并没有什么特殊需要解释的地方,而对于Student实体类的配置却稍有变化。其中的set标签就负责创建一张新表并负责关联两张表,table属性就是用于连接两张表主键值的表名(connect)。对于用于连接的表,有两个字段,一个是Student表的id,一个是teacher表的id,那么key标签就用于指定Student表id对应connect表中的名称,teacher表的id对应到connect表的名称则由many-to-many标签的column属性指定。下面我们插入多条数据:
显然,通过抽出connect表连关联两张表,对于Student和teacher表的表结构来说是更加简洁清晰的。
至此,有关Hibernate中关联映射的内容已经简单介绍完毕,虽然以后会更多的使用注解来配置这些映射关联,但是都是基于XML的,对于新手来说,学习XML配置关联映射是有助于理解注解配置。总结不到之处,望指出,下篇我们学习集合的映射。
- 初识Hibernate之关联映射(二)百度_合作
- 初识Hibernate之关联映射(二)
- 初识Hibernate之关联映射(二)
- 初识Hibernate之关联映射(一)
- 初识Hibernate之关联映射(一)
- 初识Hibernate之关联映射
- hibernate关联映射(二)
- 【HIbernate框架学习】:Hibernate对象关系映射之一对一关联映射(二)
- Hibernate 关联映射 之 多对多 关联(二) 之拆分
- Hibernate 关联映射 之 多对多 关联(二) 之拆分
- Hibernate 映射实体关联关系(二)
- hibernate之关联映射
- Hibernate 关联映射 之 一对多单项关联 (二)聪明的懒加载
- 【SSH之旅】一步步学习Hibernate框架(二):一对一关联映射中的主键关联
- Hibernate的七种映射关系之七种关联映射(二)
- Hibernate的七种映射关系之七种关联映射(二)
- Hibernate继承映射之二_用多张表映射1
- Hibernate映射解析——关联映射(二)
- 迁移VMWare虚拟机到KVM
- IOS开发中分析carsh log文件
- SDAutolayout用法解析
- linux线程绑定到指定cpu运行
- ASP.NET Core之跨平台的实时性能监控(2.健康检查)
- 初识Hibernate之关联映射(二)百度_合作
- springMV配置日志log4j,以及在linux服务器中查询日志
- ctf web常用小姿势点
- 一步一步教你使用CodeFisrt
- E周安全:黑客攻防对弈 探索下一代安全
- RecyclerViewAdapter 使用教程
- 基本的jQuery选择器
- HDPCD-Java-复习笔记(6)
- Vue学习之 生命周期钩子