摘要:屬性屬性表示控制權是否轉移控制權已轉移當前一方沒有控制權控制權沒有轉移當前一方有控制權屬性,是在維護關聯關系的時候起作用的。表的外鍵并沒有數據結論如果設置控制反轉即然后通過部門方維護關聯關系。
Inverse屬性
Inverse屬性:表示控制權是否轉移..
true:控制權已轉移【當前一方沒有控制權】
false:控制權沒有轉移【當前一方有控制權】
Inverse屬性,是在維護關聯關系的時候起作用的。只能在“一”的一方中使用該屬性!Inverse屬性的默認值為fasle,也就是當前一方是有控制權的
從一下的幾個方面看看Inverse在維護關聯關系時是否起作用:
保存數據
獲取數據
解除關聯關系
刪除數據對關聯關系的影響
保存數據將inverse屬性設置為ture,使dept沒有控制權
執行保存數據操作時,發現Hibernate只執行了三條SQL語句。employee表的外鍵并沒有數據
結論:如果設置控制反轉,即inverse=true, 然后通過部門方維護關聯關系。在保存部門的時候,同時保存員工, 數據會保存,但關聯關系不會維護。即外鍵字段為NULL
查詢數據設置inverse屬性為true,那么部門一方是沒有控制權的。
我們在查看數據的時候,發現inverse屬性對查詢數據是沒有影響的
//查詢出Dept對象 Dept de = (Dept) session.get(Dept.class, 1); System.out.println(dept.getDeptName()); System.out.println("-----------"); //用到的時候再查詢數據庫,Hibernate的懶加載【后面會講解】 System.out.println(de.getSet());解除關聯關系
部門和員工是存在外鍵的聯系的,我們接下來看看inverse屬性對于解除關聯關系有沒有影響
當部門一方有權限時,即inverse屬性為false
//查找部門id為1的信息 Dept dept1 = (Dept) session.get(Dept.class, 1); //清除關聯信息 dept1.getSet().clear();
可以解除關聯關系,employee的外鍵字段被設置為NULL了
當部門一方沒有權限時,即inverse屬性為true
//查找部門id為2的信息 Dept dept1 = (Dept) session.get(Dept.class, 2); //清除關聯信息 dept1.getSet().clear();
不能解除關聯關系
刪除數據對關聯關系的影響當部門一方有權限時,即inverse屬性為false
//查找部門id為2的信息 Dept dept1 = (Dept) session.get(Dept.class, 2); //刪除部門2 session.delete(dept1);
當有控制權的時候可以刪除數據,先把外鍵設置為NULL,再刪除數據!
當部門一方沒有權限時,即inverse屬性為true
//查找部門id為1的信息 Dept dept1 = (Dept) session.get(Dept.class, 1); //刪除部門1 session.delete(dept1);
直接拋出異常,說該部門擁有外鍵,不能刪除數據!
cascade屬性cascade表示級聯的意思,簡單來說就是操作某一屬性時,對其他關聯字段的影響
casecade屬性不像inverse屬性只能在“一”的一方設置,它可以在“一”的一方也可以在“多”的一方設置
cascade有這么幾個值
none 不級聯操作, 默認值
save-update 級聯保存或更新
delete 級聯刪除
save-update,delete 級聯保存、更新、刪除
all 同上。級聯保存、更新、刪除
級聯保存級聯保存有什么用呢???我們來看個例子:
如果在保存對象的時候,沒有把相關的對象也一并保存進數據庫,會出現錯誤。
因為它會發現dept是有外鍵的,而外鍵又是一個對象來保存著,這個對象在數據庫表中并沒有存在,因此會拋出異常
//創建對象 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外鍵的對象保存在數據庫之中
級聯刪除
級聯刪除,這個對于我們來說風險太大了,如果刪除了某些數據,會把另外有關聯的數據也刪除...在實際中我們一般不使用!
在沒有設置級聯刪除的時候,我們試試刪除dept
//刪除部門為3的記錄 Dept dept1 = (Dept) session.get(dept.getClass(), 3); session.delete(dept1);
它會先把3的外鍵對應的記錄刪除,再刪除部門的數據
在設置級聯刪除的時候,我們試試刪除dept
級聯刪除數據
//刪除部門為4的記錄 Dept dept1 = (Dept) session.get(dept.getClass(), 4); session.delete(dept1);
我們發現數據相關聯的數據都沒有了
cascade和inverse同時使用上面我們已經把cascade和inverse都介紹一遍了,那么cascade和inverse同時使用會怎么樣呢???我們來測試一下
設置dept沒有控制權,但設置級聯保存、刪除
添加一個dept對象
//添加一個dept對象 session.save(dept);
如果我們單單設置了inverse屬性為true,那么數據庫中肯定是不能維護關聯關系的【這里我們已經測試了】
但是呢,現在也設置了級聯保存,級聯保存是否可以讓該對象相關的關聯關系一并保存在數據庫中的。
我們來看看結果:
inverse的優先級是比cascade的優先級要高的,因此設置了inverse屬性為true,就無法保存關聯關系了。
參考詳細博文:
http://www.cnblogs.com/whgk/p...
ascade和inverse總結上面的測試都是通過幾個方面的,看起來有點多,因此我們總結一下
inverse屬性inverse屬性只能在“一”的一方中設置。inverse=false表示有控制權,inverse=ture表示沒有控制權
在保存關聯信息時
有控制權--->可以保存相對應的關聯數據
沒有控制權--->數據會保存,但是關聯關系沒有維護,也就是外鍵列為NULL
在查詢數據時
有無控制權對查詢數據沒有任何影響
在解除關聯關系時
有控制權--->可以解除關聯關系
沒有控制權--->不能解除關聯關系,不會生成update語句,也不會報錯
在刪除數據時對關聯關系的影響
有控制權--->將外鍵的值設置為NULL,隨后刪除數據
沒有控制權--->如果刪除的記錄有被外鍵引用,會報錯,違反主外鍵引用約束,如果刪除的記錄沒有被引用,可以直接刪除。
多對多關系的時候也是一樣的,只不過多對多的關聯關系是在中間表中
cascade屬性cascade有這么幾個值:
none 不級聯操作, 默認值
save-update 級聯保存或更新
delete 級聯刪除
save-update,delete 級聯保存、更新、刪除
all 同上。級聯保存、更新、刪除
我們可能使用到的往往是:save-update這個值,因為級聯刪除的風險太大了!
級聯保存
沒有設置級聯保存-->如果單單保存一個對象,而對象又存在外鍵時,那么就會拋出異常
設置了級聯保存-->那么就可以將對象以及有關聯關系的對象一并保存
級聯刪除
沒有設置級聯刪除-->在刪除數據的時候,會把外鍵的字段設置為NULL,再刪除當前一方的記錄
設置了級聯刪除-->把對象有關聯關系的記錄都刪除了
如果cascade和inverse同時設置時:
inverse屬性優先級是要比cascade要高的,如果inverse屬性設置了true,那么就無法保存關聯關系了
如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關注微信公眾號:Java3y
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68718.html
摘要:要是使用到日歷的話,我們想到使用這個日歷類上面僅僅是我個人總結的要點,如果有錯誤的地方還請大家給我指正。 納稅服務系統總結 納稅服務系統是我第一個做得比較大的項目(不同于javaWeb小項目),該項目系統來源于傳智Java32期,十天的視頻課程(想要視頻的同學關注我的公眾號就可以直接獲取了) 我跟著練習一步一步完成需求,才發覺原來Java是這樣用來做網站的,Java有那么多的類庫,頁面...
摘要:前言由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 前言 由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 由于更新比較頻繁,因此隔一段時間才會更新目錄導航哦~想要獲取最新原創的技術文章歡迎關注我的公眾號:Java3y Java3y文章目錄導航 Java基礎 泛型就這么簡單 注解就這么簡單 Druid數據庫連接池...
摘要:聲明添加對樂觀鎖定的支持一些屬性關聯關系獲取方式即是否采用延時加載及時加載,是在查詢數據時,也直接一起獲取關聯對象的數據。在前面的基礎上增加課程類并補充學生類學生類負責關聯關系 Hibernate 注解使用 在Hibernate中通常配置對象關系映射關系有兩種,一種是基于xml的方式,另一種是基于Hibernate Annotation庫的注解方式。在Hibernate 3.2版本和J...
摘要:中怎樣實現類之間的關系如一對多多對多的關系中怎樣實現類之間的關系如一對多多對多的關系它們通過配置文件中的來實現類之間的關聯關系的。 Hibernate常見面試題 Hibernate工作原理及為什么要用? Hibernate工作原理及為什么要用? 讀取并解析配置文件 讀取并解析映射信息,創建SessionFactory 打開Sesssion 創建事務Transation 持久化操作 提...
摘要:對象狀態中對象的狀態臨時瞬時狀態持久化狀態游離狀態學習的對象狀態是為了更清晰地知道的設計思想,以及是一級緩存的基礎當然啦,也就一點點知識臨時瞬時狀態當我們直接出來的對象就是臨時瞬時狀態的該對象還沒有被持久化沒有保存在數據庫中不受的管理持久化 對象狀態 Hibernate中對象的狀態: 臨時/瞬時狀態 持久化狀態 游離狀態 學習Hibernate的對象狀態是為了更清晰地知道Hiber...
閱讀 3661·2021-09-07 09:59
閱讀 721·2019-08-29 15:12
閱讀 803·2019-08-29 11:14
閱讀 1307·2019-08-26 13:27
閱讀 2660·2019-08-26 10:38
閱讀 3134·2019-08-23 18:07
閱讀 1271·2019-08-23 14:40
閱讀 1922·2019-08-23 12:38