七、Hibernate對映之放棄外來鍵的維護
阿新 • • 發佈:2018-12-03
什麼是外來鍵維護?
外來鍵維護就是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語句,這是因為在一方設定級聯儲存和放棄外來鍵維護的屬性.