第一章 一对多|多对一
1.1 关系表达
多表关系 多对一|一对多 多对多 一对一
客户表与联系人表是一对多的
在表中表达:
在实体中表达:
一的一方(客户)在配置中的书写:
多的一方(联系人)在配置中的书写:
1.2 操作
保存客户以及客户下的联系人
为客户增加联系人:
为客户删除联系人:
这样保存客户又保存联系人比较麻烦,希望保存客户时能顺带保存联系人,可以使用级联操作cascade,cascade有三个属性,分别是save-update级联更新保存,delete级联删除,all就是save-update+delete 。
主要是为了简化操作,少写两行代码。
在customer的配置文件下进行级联:
save-update:
delete:
在LinkMan的配置文件下进行级联:
save-update:保存联系人以及联系人对应的客户
要用的话建议只用save-update,用delete的话容易出事。
关系维护:
当我们如下图进行保存之后
首先三个insert,将一个客户和两个联系人插入并没有问题,但是接下来多了两个更新,来更新联系人的外键。客户会维护联系人与客户的关系,联系人也会维护它们之间的关系,关系维护了两次,右图的两条是冗余的,多余的两条语句是客户在维护关系,大胆推测一下,客户维护关系是在用update,联系人维护关系就是直接更新了外键。
我们可以配置inverse来决定关系是否维护
如果设置客户不维护关系,右图中的代码可以不写
在删除时,若将customer中的inverse置为true,则删除customer时不会将联系人中的外键置为空,因为customer不维护关系了。
inverse属性属于性能优化,目的是简化操作,少写两行代码。
原则:无论怎么放弃,总有一方要维护关系,一的一方放弃,也只能一的一方放弃。多的一方是不能放弃维护关系的,因为外键列字段在多的一方。
第二章 多对多
2.1 表中表达
2.2 实体表达
都使用集合表达有多个对方,不用为中间表建立实体。
User:
Role:
2.3 orm元数据
User配置文件中的配置:
Role配置文件中的配置:
剩下的反过来就好:
最后记得在主配置文件中进行配置
2.4 操作
2.4.1 增加员工和角色并进行显示
下面是个错误的示范:只进行代码的编写,不修改配置文件。
多对多操作时要向中间表中插入数据,所以如果两方都维护关系会插入两次导入报错。之前单表没事是因为单表做的时修改即update操作,在这里我们有两种方法解决这个问题。
第一种:将下面的代码进行注释
第二种:配置inverse属性,让某一方放弃对关系的维护。
在开发项目时,一定要选择一方放弃维护关系,一般谁来放弃看业务方向,例如录入员工时,需要为员工指定所属角色,那么业务方向就是由员工来维护角色,角色不需要维护与员工关系,角色放弃维护。
2.4.2 为用户增减增角色
(1)获得郝强勇用户
(2)创建公关角色
(3)将角色添加到用户中
(4)将角色转换为持久化
使用级联保存可以省掉第四部。
为郝强勇解除一个角色: