demo如下
package cn.com.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.com.dao.Sys_Role;
import cn.com.dao.Sys_User;
import cn.com.util.Hibernate_Utils;
public class Demo10 {
@Test
public void demo() {
/*
* author:命运的信徒 date:2018/12/05 arm:多对多的联级保存或更新
*/
/*
* 记住多对多的关系中是一定要一方放弃对外键的维护权的; 什么意思?例如A,B C表,B是中间表,A和B是多对多的关系 如果A
* B表都有对外键的维护权的话,就一定会导致插入重复数据的操作,中间表是每一条数据都是唯一性的,所以,一定要一方放弃对外键的维护权
*/
Session session = Hibernate_Utils.openSession();
Transaction tx = session.beginTransaction();
// 1.实体类初始化
Sys_Role role1 = new Sys_Role();
role1.setRole_id(00);
role1.setRole_memo("下属");
role1.setRole_name("下属");
Sys_Role role2 = new Sys_Role();
role2.setRole_id(01);
role2.setRole_memo("上司");
role2.setRole_name("上司");
Sys_Role role3 = new Sys_Role();
role3.setRole_id(02);
role3.setRole_memo("公司");
role3.setRole_name("员工");
Sys_User u1 = new Sys_User();
u1.setUser_code("哈哈哈");
u1.setUser_id(11);
u1.setUser_name("小田");
u1.setUser_password("123");
u1.setUser_state("启动");
Sys_User u2 = new Sys_User();
u2.setUser_code("呵呵呵");
u2.setUser_id(12);
u2.setUser_name("小杨");
u2.setUser_password("321");
u2.setUser_state("启动");
Sys_User u3 = new Sys_User();
u3.setUser_code("呵呵呵");
u3.setUser_id(13);
u3.setUser_name("小何");
u3.setUser_password("321");
u3.setUser_state("启动");
/*// 外键关系的建立
u1.getRoles().add(role2);
u1.getRoles().add(role3);
u2.getRoles().add(role1);
u2.getRoles().add(role2);
u3.getRoles().add(role1);
u3.getRoles().add(role3);*/
// 对外键关系的建立
role1.getUsers().add(u1);
role1.getUsers().add(u3);
role2.getUsers().add(u3);
role3.getUsers().add(u2);
role3.getUsers().add(u1);
// 事务的提交
/*session.save(u3);*/
session.save(role3);
session.save(role1);
session.save(role2);
tx.commit();
}
}
结果如下:
解析结果:
user表的映射文件放弃inverse=true对外键的维护;
session.save(role3);
session.save(role1);
session.save(role2);
首先在sys_role表中保存role1,role2, role3的数据
然后开始role对外键的维护
维护关系如下:
// 对外键关系的建立
role1.getUsers().add(u1);
role1.getUsers().add(u3);
role2.getUsers().add(u3);
role3.getUsers().add(u2);
role3.getUsers().add(u1);
结果如下:
再由于 <set name="users" table="sys_user_role" cascade="save-update">
role表作为主控方,user表作为被控方;
user表的操作有u1,u2,u3;
user表放弃对外键的维护
所以以下代码无效
// 外键关系的建立
u1.getRoles().add(role2);
u1.getRoles().add(role3);
u2.getRoles().add(role1);
u2.getRoles().add(role2);
u3.getRoles().add(role1);
u3.getRoles().add(role3);
user表有cascade="save-update" ,user表作为主控方,role表作为被控方,而role表的操作已经进行过了;