1. 程式人生 > >七、Hibernate對映之放棄外來鍵的維護

七、Hibernate對映之放棄外來鍵的維護

什麼是外來鍵維護?

外來鍵維護就是Hibernate操作資料庫的時候會自動更新與之相關聯的表的外來鍵值,而如果放棄外來鍵維護的話,那麼就僅僅是操作表中的資料,不會修改外來鍵值。

什麼時候需要放棄外來鍵維護?

在多對多關係的表中必須要其中一方放棄維護外來鍵,因為維護外來鍵的一方會操作中間表的外來鍵值,而如果2放都來維護的話,就會導致衝突,Hibernate執行的時候也會報錯。

在一對多關係的表中可以選擇讓一的一方(多的一方無法設定)放棄維護外來鍵,這樣做的目的是減少產生多餘的SQL語句,因為維護外來鍵的一方在更新外來鍵的時候都會執行一條sql語句來操作外來鍵的值。

如何放棄外來鍵維護?

在一對多的關係表中,找到一方的對映檔案,在<set >標籤節點上新增inverse="true"的屬性,true:放棄.false:不放棄.預設值是false.例如:

	...
	<set name="linkmans" inverse="true">
			<!-- 外來鍵的欄位名 -->
			<key column="lkm_cust_id" />
			<!-- 多方的全路徑 -->
			<one-to-many class="blog.csdn.net.mchenys.domain.Linkman"
/>
</set> ...

在多對多的關係表中,必須要讓其中之一放棄維護外來鍵,同樣在<set>標籤中新增inverse="true",例如:

	...
	<set name="roles" table="sys_user_role" inverse="true">
		<key column="user_id"/>
		<many-to-many class="blog.csdn.net.mchenys.domain.Role" column="role_id"/>
	</set>
	...

cascade和inverse的區別

cascade: 用來級聯操作(儲存、修改和刪除),強調的是操作A表的資料是否會根據關聯關係自動操作B表的資料.
inverse: 用來維護外來鍵的值,強調的是由誰來更新外來鍵的欄位.

例如在一對多的一方配置了cascade=all,inverse=true,那麼在一的一方級聯操儲存資料的時候就會忽略外來鍵的賦值,外來鍵仍然是null.
示例程式碼如下:

/**
	 * 放棄外來鍵的維護
	 * 
	 */
	@Test
	public void test9() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		
		//建立客戶
		Customer cc = new Customer();
		cc.setCust_name("小紅");
		
		//建立聯絡人
		Linkman lm = new Linkman();
		lm.setLkm_name("李明");
		
		//單項關聯
		cc.getLinkmans().add(lm);
		
		//一方級聯儲存
		session.save(cc);
		
		
		// 直接提交,不用手動update,因為持久化狀態的物件可以自動更新sql
		tr.commit();
	}

檢視控制檯,發現僅僅執行了2條insert語句,並沒有看到有針對外來鍵的update語句,這是因為在一方設定級聯儲存和放棄外來鍵維護的屬性.