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了xml
//查找部門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,就沒法保存關聯關係了。
參考詳細博文:
http://www.cnblogs.com/whgk/p...
上面的測試都是經過幾個方面的,看起來有點多,所以咱們總結一下
inverse屬性只能在「一」的一方中設置。inverse=false表示有控制權,inverse=ture表示沒有控制權
在保存關聯信息時
在查詢數據時
在解除關聯關係時
在刪除數據時對關聯關係的影響
多對多關係的時候也是同樣的,只不過多對多的關聯關係是在中間表中
cascade有這麼幾個值:
咱們可能使用到的每每是:save-update這個值,由於級聯刪除的風險太大了!
級聯保存
級聯刪除
若是cascade和inverse同時設置時:
若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠 關注微信公衆號:Java3y