1. 多表设计
1.1 表之间的关系划分
- 一对一
- 一对多(多对一)
- 多对多
2. 如何确立和实现数据库中的表关系
2.1 一对多的表关系在数据库中如何实现?
使用外键约束。我们一般习惯把一的方称为主表,把多的一方称为从表。
什么是外键:
从表中有一列,该列的取值除了null之外,只能来源于主表的主键。默认情况下,外键字段的值是可以重复的。
2.2 多对多的表关系在数据库中如何实现?
使用中间表。中间表中只有两个外键,引用两个多对多表的主键。不能有其他字段信息,至于中间表的主键,应该采用联合主键。
任何一个多方的表和中间表去比较,都是一对多的关系。
2.3 一对一的表关系在数据库中如何实现?
有两种:
第一种:建立外键的方式:
使用外键约束,唯一约束,非空约束。它是把外键字段加了非空和唯一约束。从而实现了一对一。
第二种:使用主键的方式:
让其中一张表既是主键,又是外键。
2.4 如何确立两张表之间的关系:
找外键。
3. 学习多表映射配置要遵循的步骤
- 第一步:确定两张表之间的关系
- 第二步:在数据库中实现两张表之间的关系建立
- 第三步:在实体类中描述出两个实体之间的关系
- 第四步:在映射配置文件中建立两个实体和两张表之间的关系
4. 一对多关系映射配置
示例:客户和联系人两张表
4.1 确定两张表之间的关系
一个客户可以包含多个联系人,多个联系人可以属于同一个客户。所以:客户和联系人之间的关系是一对多。
4.2 在数据库中实现两张表之间的关系建立
实现一对多的关系,靠外键。客户表是主表,联系人表是从表。我们需要在联系人表中添加外键。
4.3 在实体类中描述出两个实体之间的关系
主表的实体类应该包含从表实体类的集合引用,从表的实体类应该包含主表实体类的对象引用
1 | /** |
1 | /** |
4.4 在映射配置文件中建立两个实体和两张表之间的关系
客户配置文件:
1 | <?xml version="1.0" encoding="UTF-8" ?> |
联系人配置文件:
1 | <?xml version="1.0" encoding="UTF-8"?> |
5. 多对多关系映射配置
示例:用户和角色
5.1 确定两张表之间的关系
一个用户可以有多个角色,一个角色可以赋给多个用户,所以用户和角色之间是多对多。
5.2 在数据库中实现两张表之间的关系建立
在数据库中实现多对多要靠中间表。中间表中只能出现用户和角色主键。
5.3 在实体类中描述出两个实体之间的关系
各自包含对方一个集合引用
1 | /** |
1 | /** |
5.4 在映射配置文件中建立两个实体和两张表之间的关系
用户配置文件:
1 | <?xml version="1.0" encoding="UTF-8"?> |
角色配置文件:
1 | <?xml version="1.0" encoding="UTF-8"?> |
6. 多表增删改操作
6.1 一对多关系的操作
6.1.1 保存操作
6.1.1.1 正常保存
1 | /** |
6.1.1.2 特殊情况
1 | /** |
1 | <set name="linkmans" table="cst_linkman" inverse="true"> |
6.1.1.3 级联保存
级联操作是指当主控方执行保存、更新或者删除操作时,其关联对象(被控方)也执行相同的操作。
保存客户
1 | /** |
1 | <set name="linkmans" table="cst_linkman" inverse="true" cascade="save-update"> |
保存联系人
1 |
|
1 | <many-to-one name="customer" class="Customer" column="lkm_cust_id" cascade="save-update"/> |
6.1.2 更新操作
1 | /** |
6.1.3 删除操作
1 | /** |
1 | <set name="linkmans" table="cst_linkman" inverse="true" cascade="save-update,delete"> |
6.2 多对多关系的操作
6.2.1 保存操作
1 | /** |
6.2.2 删除操作
1 | /** |
7. Hibernate中的多表查询
7.1 对象导航查询
7.1.1 概述
对象图导航检索方式是根据已经加载的对象,导航到他的关联对象。它利用类与类之间的关系来检索对象。
例如:我们通过OID查询方式查出一个客户,可以调用Customer类中的getLinkMans()方法来获取该客户的所有联系人。
对象导航查询的使用要求是:两个对象之间必须存在关联关系。
7.1.2 对象导航检索示例
查询联系人
1 | /** |
查询客户
1 | /** |
1 | <many-to-one name="customer" class="Customer" column="lkm_cust_id" cascade="save-update" lazy="false"/> |
load方法加载
1 | /** |
- class标签的lazy:它只能管load方法是否是延迟加载。
- set标签的lazy:它管查询关联的集合对象是否是延迟加载。
- many-to-one的lazy:它管查询关联的主表实体是否是立即加载。
-------------本文结束感谢您的阅读-------------
本文标题: Hibernate(三)
本文链接: https://wgy1993.gitee.io/archives/3e87eb50.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!