1.一对多 | 多对一
关系表达:Customer表种一个客户对应着Linkman表中的多个联系人
1>在数据库中的表达:Customer的主键是Linkman中的外键(主外键联系),有外键的一般是多的一方
2>在domain实体类中的表达:一对多的一方使用集合(表达含有多个),多对一的一方直接引用即可(表达属于那一方)(Set集合不重复)
3>orm元数据中的表达:1-1-1
name属性:自己实体类集合属性名 、column属性: 自己表中外键列名、class属性: 对方实体
一对多:一的方Customer
<set name="linkmans">
<key column="lkm_cust_id"></key>
<one-to-many class="Linkman"/>
</set>
多对一:多的一方Linkman
<many-to-one name="customer" column="lkm_cust_id" class="Customer"></many-to-one>
4>操作关联属性:
保存两个表的操作
Customer ct = new Customer();
ct.setCust_name("i3-8100");
Linkman lk = new Linkman();
lk.setLkm_name("ceo");
lk.setCustomer(ct);//表达对多,联系人属于哪个客户
Linkman lk2 = new Linkman();
lk2.setLkm_name("coo");
lk2.setCustomer(ct);//表达对多,联系人属于哪个客户
ct.getLinkmans().add(lk);//表达一对多,客户下有多个联系人
ct.getLinkmans().add(lk2);
session.save(ct);//保存操作
session.save(lk);
session.save(lk2);
删除联系人操作
//1> 获得要操作的客户对象
Customer c = session.get(Customer.class,1l);
//2> 获得要移除的联系人
LinkMan lm = session.get(LinkMan.class, 3l);
//3> 将联系人从客户集合中移除
c.getLinkMens().remove(lm);
lm.setCustomer(null);
单一保存联系人操作
//1> 获得要操作的客户对象
Customer c = session.get(Customer.class,1l);
//2> 创建联系人
LinkMan lm1 = new LinkMan();
lm1.setLkm_name("郝强勇");
//3> 将联系人添加到客户,将客户设置到联系人中
c.getLinkMens().add(lm1);
lm1.setCustomer(c);
//4> 执行保存
session.save(lm1);
5>进阶操作:级联属性cascade、关系维护inverse
cascade级联操作: 简化操作.目的就是为了少些两行代码.
inverse属性: 性能优化.提高关系维护的性能.原则: 无论怎么放弃,总有一方必须要维护关系. 一对多关系中: 一的一方放弃.也只能一的一方放弃.多的一方不能放弃.
<!-- 一对多表Customer -->
<!--
name属性:集合属性名
column属性: 外键列名
class属性: 与我关联的对象完整类名
-->
<!--
级联操作: cascade
save-update: 级联保存更新
delete:级联删除
all:save-update+delete
-->
<!-- inverse属性: 配置关系是否维护.
true: customer不维护关系
false(默认值): customer维护关系
-->
<set name="linkmans" cascade="delete" inverse="true">
<key column="lkm_cust_id"></key>
<one-to-many class="Linkman"/>
</set>
<!-- 多对一表Linkman -->
<many-to-one name="customer" column="lkm_cust_id" class="Customer" cascade="save-update"></many-to-one>
2.多对多关系
关系表达:一个用户对应多个角色,一个角色对应多个用户
多对多关系中必须有一方放弃关系维护:inverse="true"
1>在数据库中的表达
数据库中使用多对多关系时,我们会创建一个第三方的关系表来表达多对多关系
2>在domain实体中的表达
双方都是用Set集合来表达多对多的对应关系(Set集合不重复)
3>在orm元数据中的表达:2-1-2
name属性:自己实体类集合属性名 、table:第三方关系表名、column属性(key): 自己表中外键列名、class属性: 对方实体名、column属性(many):对方表中外键列名
<--两方配置相方即可-->
<set name="roles" table="sys_user_role" cascade="save-update">
<key column="user_id"></key>
<many-to-many class="Role" column="role_id"></many-to-many>
</set>
4>关系操作
与一对多相同
5>进阶操作
与一对多相同:多对多关系中必须有一方放弃关系维护:inverse="true"