一、关系表达
表中:使用中间表,至少两列都是外键列,分别引用两张表的主键
对象中:两方都使用集合来表达拥有多个对方
orm元数据:
<!-- 多对多关系表达 --> <!-- name: 集合属性名 table: 配置中间表名 key |-column:外键,别人引用"我"的外键列名 class: 我与哪个类是多对多关系 column:外键.我引用比人的外键列名 --> <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>
二、操作关联属性
1、操作关联属性:
public 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(); }2、为大神新增一个角色
//1> 获得大神用户 User user = session.get(User.class, 1l); //2> 创建CEO角色 Role r = new Role(); r.setRole_name("CEO"); //3> 将角色添加到用户中 user.getRoles().add(r); //4> 将角色转换为持久化 session.save(r);3、为大神解除角色
//1> 获得大神用户 User user = session.get(User.class, 1l); //2> 获得要操作的角色对象(CEO,专家) Role r1 = session.get(Role.class, 1l); Role r2 = session.get(Role.class, 2l); //3> 将角色从用户的角色集合中移除 user.getRoles().remove(r1); user.getRoles().remove(r2);
三、操作进阶
1、inverse属性
<!-- 使用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>
2、级联属性
<!-- 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>