Hibernate表关系详细教案

Hibernate表关系详细教案回顾任务目标关联映射级联操作一. 一对多映射1.基本应用1.1 准备项目1.2 创建订单表1.3 创建Order实体类1.4 修改Customer实体类1.5 Customer配置一对多1.6 Order配置多对一1.7 将映射文件加入hibernate.cfg.xml1.8 测试新增关联数据1.9 测试查询订单2、cascade级联操作2.1. 测试级联保存2.2 测试级联删除3、inverse关系反转3.1、分析前面的测试3.2、优化3.3、也可以保存订单3.4、结论二. 多对多映射1.基本配置1.1 创建User实体类1.2 创建Role实体类1.3 User映射配置1.4 Role配置1.5 核心配置文件添加映射路径1.6、测试增加4.7、级联保存4.8、级联删除三. 一对一映射的两种设计方案1. 一对一唯一外键关联1.1 创建持久化类1.2 配置映射文件1.3 核心配置1.4 测试2. 一对一主键关联2.1 创建持久化类2.2 配置2.3 修改核心配置文件2.4 测试课前默写作业面试题

回顾

1. Hibernate中事务特征及其传播性
2. 更新数据丢失问题
3. Hibernate中的主键策略
4. Hibernate对象的三种状态
5. Hibernate的一级缓存策略

任务

1. 一对多映射
2. 多对多映射
3. 一对一映射

目标

1. 掌握一对多映射
2. 掌握多对多映射
3. 掌握一对一映射
关联映射
级联操作

一. 一对多映射

1.基本应用
1.1 准备项目
1.2 创建订单表

表名: t_order

语句

 

1.3 创建Order实体类
 

1.4 修改Customer实体类

​ 添加关联订单

 

1.5 Customer配置一对多
 

1.6 Order配置多对一
 

1.7 将映射文件加入hibernate.cfg.xml
 

1.8 测试新增关联数据
 

1.9 测试查询订单
 

2、cascade级联操作
2.1. 测试级联保存

当只保存双向关联关系的一方时,会报告错误,此时应该在customer中配置级联保存

级联操作:就是操作一个对象的时候,想同时操作它的关联对象。

修改映射文件

 

如下用例,可以先测试查看报错信息;再配置上面的级联保存,然后再次进行测试,成功。

 

2.2 测试级联删除

当只删除父记录时,在删除客户的时候,Hibernate会把订单表的外键值置空,此时可以配置级联删除

 

测试代码

 

3、inverse关系反转

3.1、分析前面的测试
  1. 运行级联保存的测试用例
  2. 查看日志中的sql语句

插入一个用户、两个订单,应该执行3个insert语句

但是发现日志中多打印了两个update语句

默认情况下inverse的值是false:

 

表示customer 一方需要维护关联关系,因此需要维护外键,有关联记录生成时,会做外键的更新操作。

而这个更新操作是没有必要的,因为order插入的时候已经将外键值插入。

所以customer中的update的语句是多余的

3.2、优化

inverse 配置:表示是否把关联关系的维护权反转(放弃)

false:默认值,不反转(不放弃)

true:反转(放弃)

放弃customer方的外键维护

 

重新测试,发现只有三条insert语句!

3.3、也可以保存订单

step1:保存时,保存订单

 

step2:在订单端设置级联保存

 

3.4、结论

通常在一对多的关联配置中,多方无法放弃关系维护权,所以应该放弃 1 方的维护权,意味着在 1 方加上 inverse=true 配置

二. 多对多映射

需求: 用户与角色是多对多的关系

1.基本配置
1.1 创建User实体类
 

1.2 创建Role实体类
 

1.3 User映射配置
 

1.4 Role配置
 

1.5 核心配置文件添加映射路径
 

1.6、测试增加

注意:以下测试用例如果直接执行,会报告联合主键插入重复的错误。因此可以在任意一方设置inverse选项=true

 

测试代码:

 

4.7、级联保存

注意:在多对多的保存中,如果不设置级联保存,也不设置inverse="true",那么会报告联合主键重复的错误。

可以设置级联保存,在User的多对多关联中设置如下:

 

测试代码:

 

4.8、级联删除

当没有设置级联删除的时候,如果删除User表中的记录,那么只删除User表和关联表中的记录

当设置了级联删除的时候,如果删除User表中的记录,那么会将User表、关联表和Role表中的记录全部删除!

 

测试:

 

三. 一对一映射的两种设计方案

需求:公民表和身份证表是一对一的关系

设计表的两种方案:

1506750828423

1. 一对一唯一外键关联
1.1 创建持久化类

Person

 

Card

 

1.2 配置映射文件

Person.hbm.xml

 

Card.hbm.xml

 

1.3 核心配置
 

1.4 测试
 

2. 一对一主键关联
2.1 创建持久化类

Person

 

Card

 

2.2 配置

Person.hbm.xml

 

Card.hbm.xml

 

2.3 修改核心配置文件
 

2.4 测试
 

课前默写

1. Hibernate中事务传播性的几种方案
2. Hibernate中的主键的几种实现策略
3. Hibernate对象的三种状态相互转换的方法

作业

 

面试题

1. Hibernate中关联映射的配置方法
2. Hibernate多对多映射方案(组合主键、非组合主键)
3. Hibernate中Cascade关键字和inverse关键字的用法