Hibernate 雙向關聯產生多餘的sql語句
阿新 • • 發佈:2018-12-09
如下操作會導致重複更新資料:
package cn.com.test; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import cn.com.dao.Kinds; import cn.com.dao.User; import cn.com.util.Hibernate_Utils; public class Demo7 { /* * author:命運的信徒 date:2018/12/04 arm: 雙向關聯產生多餘的sql語句 */ @Test public void demo() { /* 換一句話說就是把user表中某個資訊的職務是員工的改成是經理的 */ // 1.連線資料庫 Session session = Hibernate_Utils.openSession(); // 2.開啟事務 Transaction tx = session.beginTransaction(); // 3.實體類初始化 // 4.獲取資料 User u = session.get(User.class, "001"); Kinds k = session.get(Kinds.class, "文員"); u.setKk(k); k.getUu().add(u); tx.commit(); session.close(); } }
在一對多的一方設定inverse="true"如下:
<set name="uu" cascade="delete,save-update" inverse="true">
區分cascade和inverse
inverse:放棄對外來鍵的維護權
同樣的程式碼
如果kinds的對映檔案裡面沒有 inverse="true"的話,user表裡面是 金英 011 前臺;
如果有 inverse="true"這句話的話,插入user表中的是金英 011 null;
package cn.com.test; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import cn.com.dao.Kinds; import cn.com.dao.User; import cn.com.util.Hibernate_Utils; public class DeMO8 { @Test public void demo(){ /* * author:命運的信徒 * date:2018/12/04 14:53:00 * arm:cascade與inverse的區別 */ //cascade強調的是操作一個物件的時候對否操作其關聯物件 //inverse強調的是放棄外來鍵的維護權 Session session=Hibernate_Utils.openSession(); Transaction tx=session.beginTransaction(); Kinds k=new Kinds(); k.setKinds("前臺"); User u=new User(); u.setName("金英"); u.setNumber("011"); //1.建立關係 k.getUu().add(u); session.save(k); tx.commit(); session.close(); // 同樣的程式碼如果kinds的對映檔案裡面沒有 inverse="true"的話,user表裡面是 金英 011 前臺; //如果有 inverse="true"這句話的話,插入user表中的是金英 011 null; } }
demo2
當修改user表的時候
如果kinds對映檔案是加了inverse="true"放棄外來鍵的維護權,怎麼修改都沒有用處;
cascade的作用:設定的一方作為主控方,另一方是被控方,主控方發生變化,有建立關係的另一方也執行crud操作;
inverse的作用是不是可以理解為:在cascade的基礎上只不過是遮蔽了對外來鍵的任何作用;
package cn.com.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.com.dao.Kinds;
import cn.com.dao.User;
import cn.com.util.Hibernate_Utils;
public class Demo7 {
/*
* author:命運的信徒 date:2018/12/04 arm: 雙向關聯產生多餘的sql語句
*/
@Test
public void demo() {
/* 換一句話說就是把user表中某個資訊的職務是員工的改成是經理的 */
// 1.連線資料庫
Session session = Hibernate_Utils.openSession();
// 2.開啟事務
Transaction tx = session.beginTransaction();
// 3.實體類初始化
// 4.獲取資料
User u = session.get(User.class, "011");
Kinds k = session.get(Kinds.class, "總經理");
//u.setKk(k);
k.getUu().add(u);
tx.commit();
session.close();
}
}