1. 程式人生 > >hibernate 多對多的相關操作 級聯儲存或更新

hibernate 多對多的相關操作 級聯儲存或更新

 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表的操作已經進行過了;