日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

hibernate mysql cascade_Hibernate第五篇【inverse、cascade属性详解】

發(fā)布時間:2025/3/12 数据库 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hibernate mysql cascade_Hibernate第五篇【inverse、cascade属性详解】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

上一篇博文已經講解了一對多和多對一之間的關系了,一對多和多對一存在著關聯(lián)關系(外鍵與主鍵的關系)。本博文主要講解Inverse屬性、cascade屬性。這兩個屬性對關聯(lián)關系都有影響

Inverse屬性

Inverse屬性:表示控制權是否轉移..

true:控制權已轉移【當前一方沒有控制權】

false:控制權沒有轉移【當前一方有控制權】

Inverse屬性,是在維護關聯(lián)關系的時候起作用的。只能在“一”的一方中使用該屬性!Inverse屬性的默認值為fasle,也就是當前一方是有控制權的

從一下的幾個方面看看Inverse在維護關聯(lián)關系時是否起作用:

保存數據

獲取數據

解除關聯(lián)關系

刪除數據對關聯(lián)關系的影響

保存數據

將inverse屬性設置為ture,使dept沒有控制權

執(zhí)行保存數據操作時,發(fā)現Hibernate只執(zhí)行了三條SQL語句。employee表的外鍵并沒有數據

結論:如果設置控制反轉,即inverse=true, 然后通過部門方維護關聯(lián)關系。在保存部門的時候,同時保存員工, 數據會保存,但關聯(lián)關系不會維護。即外鍵字段為NULL

查詢數據

設置inverse屬性為true,那么部門一方是沒有控制權的。

我們在查看數據的時候,發(fā)現inverse屬性對查詢數據是沒有影響的

//查詢出Dept對象

Dept de = (Dept) session.get(Dept.class, 1);

System.out.println(dept.getDeptName());

System.out.println("-----------");

//用到的時候再查詢數據庫,Hibernate的懶加載【后面會講解】

System.out.println(de.getSet());

解除關聯(lián)關系

部門和員工是存在外鍵的聯(lián)系的,我們接下來看看inverse屬性對于解除關聯(lián)關系有沒有影響

當部門一方有權限時,即inverse屬性為false

//查找部門id為1的信息

Dept dept1 = (Dept) session.get(Dept.class, 1);

//清除關聯(lián)信息

dept1.getSet().clear();

可以解除關聯(lián)關系,employee的外鍵字段被設置為NULL了

當部門一方沒有權限時,即inverse屬性為true

//查找部門id為2的信息

Dept dept1 = (Dept) session.get(Dept.class, 2);

//清除關聯(lián)信息

dept1.getSet().clear();

不能解除關聯(lián)關系

刪除數據對關聯(lián)關系的影響

當部門一方有權限時,即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表示級聯(lián)的意思,簡單來說就是操作某一屬性時,對其他關聯(lián)字段的影響

casecade屬性不像inverse屬性只能在“一”的一方設置,它可以在“一”的一方也可以在“多”的一方設置

cascade有這么幾個值

none 不級聯(lián)操作, 默認值

save-update 級聯(lián)保存或更新

delete 級聯(lián)刪除

save-update,delete 級聯(lián)保存、更新、刪除

all 同上。級聯(lián)保存、更新、刪除

級聯(lián)保存

級聯(lián)保存有什么用呢???我們來看個例子:

如果在保存對象的時候,沒有把相關的對象也一并保存進數據庫,會出現錯誤。

因為它會發(fā)現dept是有外鍵的,而外鍵又是一個對象來保存著,這個對象在數據庫表中并沒有存在,因此會拋出異常

//創(chuàng)建對象

Dept dept = new Dept();

dept.setDeptName("開發(fā)部");

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中設置了級聯(lián)保存,那么Hibernate就會知道:保存dept的數據時,發(fā)現dept了外鍵,也把dept外鍵的對象保存在數據庫之中

級聯(lián)刪除

級聯(lián)刪除,這個對于我們來說風險太大了,如果刪除了某些數據,會把另外有關聯(lián)的數據也刪除...在實際中我們一般不使用!

在沒有設置級聯(lián)刪除的時候,我們試試刪除dept

//刪除部門為3的記錄

Dept dept1 = (Dept) session.get(dept.getClass(), 3);

session.delete(dept1);

它會先把3的外鍵對應的記錄刪除,再刪除部門的數據

在設置級聯(lián)刪除的時候,我們試試刪除dept

級聯(lián)刪除數據

//刪除部門為4的記錄

Dept dept1 = (Dept) session.get(dept.getClass(), 4);

session.delete(dept1);

我們發(fā)現數據相關聯(lián)的數據都沒有了

cascade和inverse同時使用

上面我們已經把cascade和inverse都介紹一遍了,那么cascade和inverse同時使用會怎么樣呢???我們來測試一下

設置dept沒有控制權,但設置級聯(lián)保存、刪除

添加一個dept對象

//添加一個dept對象

session.save(dept);

如果我們單單設置了inverse屬性為true,那么數據庫中肯定是不能維護關聯(lián)關系的【這里我們已經測試了】

但是呢,現在也設置了級聯(lián)保存,級聯(lián)保存是否可以讓該對象相關的關聯(lián)關系一并保存在數據庫中的。

我們來看看結果:

inverse的優(yōu)先級是比cascade的優(yōu)先級要高的,因此設置了inverse屬性為true,那么cascade就無效了。

參考詳細博文:

總結

上面的測試都是通過幾個方面的,看起來有點多,因此我們總結一下

inverse屬性

inverse屬性只能在“一”的一方中設置。inverse=false表示有控制權,inverse=ture表示沒有控制權

在保存關聯(lián)信息時

有控制權--->可以保存相對應的關聯(lián)數據

沒有控制權--->數據會保存,但是關聯(lián)關系沒有維護,也就是外鍵列為NULL

在查詢數據時

有無控制權對查詢數據沒有任何影響

在解除關聯(lián)關系時

有控制權--->可以解除關聯(lián)關系

沒有控制權--->不能解除關聯(lián)關系,不會生成update語句,也不會報錯

在刪除數據時對關聯(lián)關系的影響

有控制權--->將外鍵的值設置為NULL,隨后刪除數據

沒有控制權--->如果刪除的記錄有被外鍵引用,會報錯,違反主外鍵引用約束,如果刪除的記錄沒有被引用,可以直接刪除。

多對多關系的時候也是一樣的,只不過多對多的關聯(lián)關系是在中間表中

cascade屬性

cascade有這么幾個值:

none 不級聯(lián)操作, 默認值

save-update 級聯(lián)保存或更新

delete 級聯(lián)刪除

save-update,delete 級聯(lián)保存、更新、刪除

all 同上。級聯(lián)保存、更新、刪除

我們可能使用到的往往是:save-update這個值,因為級聯(lián)刪除的風險太大了!

級聯(lián)保存

沒有設置級聯(lián)保存-->如果單單保存一個對象,而對象又存在外鍵時,那么就會拋出異常

設置了級聯(lián)保存-->那么就可以將對象以及有關聯(lián)關系的對象一并保存

級聯(lián)刪除

沒有設置級聯(lián)刪除-->在刪除數據的時候,會把外鍵的字段設置為NULL,再刪除當前一方的記錄

設置了級聯(lián)刪除-->把對象有關聯(lián)關系的記錄都刪除了

如果cascade和inverse同時設置時:

inverse屬性優(yōu)先級是要比cascade要高的

總結

以上是生活随笔為你收集整理的hibernate mysql cascade_Hibernate第五篇【inverse、cascade属性详解】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。