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