Hibernate-3
目录
一对多|多对一
关系表达
表中的表达
orm元数据中表达
一对多
<!--集合,一对多关系,在配置文件中配置-->
<!--
name属性:集合属性名
column属性:外键列名
Class属性:与我关联的对象完整类名
-->
<set name="linkMens">
<key column="lkm_cust_id"></key>
<one-to-many class="LinkMen" />
</set>
多对一
<!--
name属性:引用属性名
column属性:外键列名
Class属性:与我关联的对象完整类名
-->
<many-to-one name="customer" column="lkm_cust_id" class="Customer">
</many-to-one>
操作
操作关系属性
//3操作
Customer c = new Customer();
c.setCust_name("传智播客");
LinkMan lm1 = new LinkMen();
lm1.setLkm_name("李活命");
LinkMan lm2 = new LinkMan();
lm2.setLkm_name("刘跃东");
//表达一对多,客户下有多个联系人
c.getLinkMens().add(lm1);
c.getLinkMens().add(lm2);
session.save(c);
session.save(lm1);
session.save(lm2);
进阶操作
级联操作
<!--
级联操作:cascade
save-update:级联保存更新
delete:级联删除
all:save—update+delete
级联操作:简化操作,目的是少写两行代码
-->
结论:简化操作。一定要用save-update,不建议使用delete。
关系维护
Hibernate:
update
cst_linkman
set
lkm_cust_id=?
where
lkm_id=?
Hibernate:
update
cst_linkman
set
lkm_cust_id=?
where
lkm_id=?
在保存时,两方都会维护外键关系,关系维护两次,冗余了。
多余的维护关系语句显然是客户这一端在维护关系。
<!--
inverse属性:配置关系是否维护
true:customer不维护关系
false(默认值):customer维护关系
inverse属性:性能优化,提高关系维护的性能
原则:无论怎么放弃,总有一方必须要维护关系
一对多关系中,一的一方放弃,也只能一的一方放弃,多的一方不能放弃
-->
多对多
关系表达
表中
对象中
orm元数据
<!-- 多对多关系表达-->
<!--
name:集合属性名
table: 配置中间表名
key
|-column:外键,别人引用我的外键列名
class:我与哪个类是多对多关系
column:外键,我引用此人的外键列名
-->
<set name="roles" table="sys_users_role">
<key column="user_id"></key>
<many-to-many class="Role" column="role_id"></many-to-many>
</set>
操作
操作关联属性
//3>用户表达关系
u1.getRoles().add(r1);
u1.getRoles().add(r2);
u2.getRoles().add(r1);
u2.getRoles().add(r2);
//4> 角色表达关系
r1.getUsers().add(u1);
r1.getUsers().add(u2);
r2.getUsers().add(u1);
r2.getUsers().add(u2);
操作进阶
inverse属性
<!--
使用inverse属性
true:放弃维护外键关系
false(默认值):维护关系
结论:将来在开发中,如果遇到多对多关系,一定要选择一方放弃维护关系。一般谁来放弃要看业务方向,例如录入员工时,需要为员工指定所属角色。那么业务方向就是由员工维护角色,角色不需要维护与员工关系,角色放弃维护。
-->
级联属性
<!--cascade级联操作-->
save-update:级联保存更新
delete:级联删除
all:级联保存更新+级联删除
结论:cascade简化代码书写,该属性是不是用无所谓。建议要用只用save-update,如果使用delete操作太过危险,尤其在多对多中不建议使用。