hibernate 多对多的相关操作 级联保存或更新

版权声明:博客知识产权来源命运的信徒,切勿侵权 https://blog.csdn.net/qq_37591637/article/details/84820513

 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表的操作已经进行过了;

猜你喜欢

转载自blog.csdn.net/qq_37591637/article/details/84820513