一对多|多对一
关系表达
实体关系表达
User实体中的关系表达
LinkMan实体中关系表达
orm元数据关系表达
<!-- 一的一方 -->
<set name="linkMens">
<key column="lkm_cust_id" />
<one-to-many class="LinkMan" />
</set>
<!-- 多的一方 -->
<!--
name属性:引用属性名
column属性: 外键列名
class属性: 与我关联的对象完整类名
-->
<many-to-one name="user" column="lkm_cust_id" class="User" >
操作
public static void fun1() {
// 1、获得session
Session session = HibernateUtils.openSession();
// 2、开启事务
Transaction transaction = session.beginTransaction();
// 3、执行操作
// 3.1创建用户
User user = new User();
user.setPassword("123");
// 3.1创建联系人
LinkMan man1 = new LinkMan();
man1.setLkm_name("张三");
LinkMan man2 = new LinkMan();
man2.setLkm_name("李四");
// 表达一对多,客户下有多个联系人
user.getLinkMens().add(man1);
user.getLinkMens().add(man2);
// 表达多对一,联系人属于哪个客户
man1.setUser(user);
man2.setUser(user);
//执行保存
session.save(man1);//通过级联操作可以省本行代码
session.save(man2);//通过级联操作可以省本行代码
session.save(user);
// 4、提交事务
transaction.commit();
// 5、关闭资源
session.close();
}
操作进阶
级联操作(配置文件)
<!-- 多的一方 -->
<!-- cascade: 级联操作
减少我们书写的操作代码.
none(默认值) 不级联
save-update: 级联保存
delete: 级联删除
all: 级联保存+级联删除
结论: 可以使用save-update.不推荐使用delete. 也可以不用cascade.
-->
<set name="linkMens" cascade="save-update" inverse="true">
<key column="lkm_cust_id"></key>
<one-to-many class="LinkMan" />
</set>
多对多
关系表达
实体关系表达
User实体中的关系表达
Role实体中的关系表达
orm元数据关系表达
<!-- 双方配置相同 -->
<!-- table:中间表名 -->
<set name="roles" table="sys_user_role" >
<!-- column:自己的主键 -->
<key column="user_id" ></key>
<!-- column:另一方的主键 -->
<many-to-many class="Role" column="role_id" ></many-to-many>
</set>
操作
public static void fun1() {
// 1 获得session
Session session = HibernateUtils.openSession();
// 2 开启事务
Transaction tx = session.beginTransaction();
// -------------------------------------------------
// 3操作
// 1> 创建两个 User
User u1 = new User();
u1.setUser_name("张三");
User u2 = new User();
u2.setUser_name("李四");
// 2> 创建两个 Role
Role r1 = new Role();
r1.setRole_name("保洁");
Role r2 = new Role();
r2.setRole_name("保安");
// 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);
// 5> 调用Save方法一次保存
session.save(u1);
session.save(u2);
session.save(r1);
session.save(r2);
// -------------------------------------------------
// 4提交事务
tx.commit();
// 5关闭资源
session.close();
}
操作进阶
级联操作和(配置文件)
<!-- 使用inverse属性
true: 放弃维护外键关系
false(默认值):维护关系
结论: 将来在开发中,如果遇到多对多关系.一定要选择一方放弃维护关系.
一般谁来放弃要看业务方向. 例如录入员工时,需要为员工指定所属角色.
那么业务方向就是由员工维护角色. 角色不需要维护与员工关系.角色放弃维护
-->
<set name="users" table="sys_user_role" inverse="true" >
<key column="role_id" ></key>
<many-to-many class="User" column="user_id" ></many-to-many>
</set>
<!-- cascade级联操作:
save-update: 级联保存更新
delete:级联删除
all:级联保存更新+级联删除
结论: cascade简化代码书写.该属性使不使用无所谓. 建议要用只用save-update.
如果使用delete操作太过危险.尤其在多对多中.不建议使用
-->
<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>