1. 程式人生 > >Hibernate 雙向關聯產生多餘的sql語句

Hibernate 雙向關聯產生多餘的sql語句

如下操作會導致重複更新資料:

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();
	}
}