Inverse屬性:表示控制權是否轉移..html
Inverse屬性,是在維護關聯關係的時候起做用的。只能在「一」的一方中使用該屬性!Inverse屬性的默認值爲fasle,也就是當前一方是有控制權的java
從一下的幾個方面看看Inverse在維護關聯關係時是否起做用:數據庫
將inverse屬性設置爲ture,使dept沒有控制權微信
<!--維護關係的是Set集合,對應employee表-->
<set cascade="save-update" name="set" table="employee" inverse="true">
複製代碼
執行保存數據操做時,發現Hibernate只執行了三條SQL語句。employee表的外鍵並無數據session
結論:若是設置控制反轉,即inverse=true, 而後經過部門方維護關聯關係。在保存部門的時候,同時保存員工, 數據會保存,但關聯關係不會維護。即外鍵字段爲NULL測試
設置inverse屬性爲true,那麼部門一方是沒有控制權的。spa
<set cascade="save-update" name="set" table="employee" inverse="true">
複製代碼
咱們在查看數據的時候,發現inverse屬性對查詢數據是沒有影響的3d
//查詢出Dept對象
Dept de = (Dept) session.get(Dept.class, 1);
System.out.println(dept.getDeptName());
System.out.println("-----------");
//用到的時候再查詢數據庫,Hibernate的懶加載【後面會講解】
System.out.println(de.getSet());
複製代碼
部門和員工是存在外鍵的聯繫的,咱們接下來看看inverse屬性對於解除關聯關係有沒有影響code
//查找部門id爲1的信息
Dept dept1 = (Dept) session.get(Dept.class, 1);
//清除關聯信息
dept1.getSet().clear();
複製代碼
能夠解除關聯關係,employee的外鍵字段被設置爲NULL了cdn
//查找部門id爲2的信息
Dept dept1 = (Dept) session.get(Dept.class, 2);
//清除關聯信息
dept1.getSet().clear();
複製代碼
不能解除關聯關係
//查找部門id爲2的信息
Dept dept1 = (Dept) session.get(Dept.class, 2);
//刪除部門2
session.delete(dept1);
複製代碼
當有控制權的時候能夠刪除數據,先把外鍵設置爲NULL,再刪除數據!
//查找部門id爲1的信息
Dept dept1 = (Dept) session.get(Dept.class, 1);
//刪除部門1
session.delete(dept1);
複製代碼
直接拋出異常,說該部門擁有外鍵,不能刪除數據!
cascade表示級聯的意思,簡單來講就是操做某一屬性時,對其餘關聯字段的影響
casecade屬性不像inverse屬性只能在「一」的一方設置,它能夠在「一」的一方也能夠在「多」的一方設置
cascade有這麼幾個值
級聯保存有什麼用呢???咱們來看個例子:
//建立對象
Dept dept = new Dept();
dept.setDeptName("開發部");
Employee zs = new Employee();
zs.setEmpName("張珊");
zs.setSalary(1111);
Employee ls = new Employee();
ls.setEmpName("李四");
ls.setSalary(2222);
//維護關係
dept.getSet().add(zs);
dept.getSet().add(ls);
//保存dept對象
session.save(dept);
複製代碼
若是咱們在dept中設置了級聯保存,那麼Hibernate就會知道:保存dept的數據時,發現dept了外鍵,也把dept外鍵的對象保存在數據庫之中
<set name="set" table="employee" cascade="save-update" >
複製代碼
級聯刪除,這個對於咱們來講風險太大了,若是刪除了某些數據,會把另外有關聯的數據也刪除...在實際中咱們通常不使用!
//刪除部門爲3的記錄
Dept dept1 = (Dept) session.get(dept.getClass(), 3);
session.delete(dept1);
複製代碼
它會先把3的外鍵對應的記錄刪除,再刪除部門的數據
<set name="set" table="employee" cascade="save-update,delete" >
複製代碼
//刪除部門爲4的記錄
Dept dept1 = (Dept) session.get(dept.getClass(), 4);
session.delete(dept1);
複製代碼
咱們發現數據相關聯的數據都沒有了
上面咱們已經把cascade和inverse都介紹一遍了,那麼cascade和inverse同時使用會怎麼樣呢???咱們來測試一下
<set name="set" table="employee" cascade="save-update,delete" inverse="true" >
複製代碼
//添加一個dept對象
session.save(dept);
複製代碼
若是咱們單單設置了inverse屬性爲true,那麼數據庫中確定是不能維護關聯關係的【這裏咱們已經測試了】
可是呢,如今也設置了級聯保存,級聯保存是否可讓該對象相關的關聯關係一併保存在數據庫中的。
咱們來看看結果:
inverse的優先級是比cascade的優先級要高的,所以設置了inverse屬性爲true,那麼cascade就無效了。
參考詳細博文:
http://www.cnblogs.com/whgk/p/6135591.html
上面的測試都是經過幾個方面的,看起來有點多,所以咱們總結一下
inverse屬性只能在「一」的一方中設置。inverse=false表示有控制權,inverse=ture表示沒有控制權
多對多關係的時候也是同樣的,只不過多對多的關聯關係是在中間表中
cascade有這麼幾個值:
咱們可能使用到的每每是:save-update這個值,由於級聯刪除的風險太大了!
若是cascade和inverse同時設置時:
若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠關注微信公衆號:Java3y