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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate @OneToMany 及 @Cascade级联操作

發(fā)布時間:2025/3/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate @OneToMany 及 @Cascade级联操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

??點擊上方?好好學(xué)java?,選擇?星標(biāo)?公眾號

重磅資訊、干貨,第一時間送達(dá) 今日推薦:團隊開發(fā)中的 Git 實踐個人原創(chuàng)+1博客:點擊前往,查看更多 作者:潘佳琦 鏈接:https://segmentfault.com/a/1190000021857759

前言

image.png

由圖中可以看出實體間關(guān)系:一對多(@OneToMany)

在實際開發(fā)場景中,刪除員工老板不會被刪除,老板被刪除了員工肯定要刪除

由此,就會使用級聯(lián)操作,在一對多關(guān)系中,@Cascade屬性(級聯(lián))只設(shè)置“一”的一方即可,外鍵由“多”的一方進行維護。

@ManyToOne和@OneToMany 注解

  • ManyToOne(多對一)單向:不產(chǎn)生中間表,但可以用@Joincolumn(name=" ")來指定生成外鍵的名字,外鍵在多的一方表中產(chǎn)生。

  • OneToMany(一對多)單向:會產(chǎn)生中間表,此時可以用@onetoMany @Joincolumn(name=" ")避免產(chǎn)生中間表,并且指定了外鍵的名字(別看@joincolumn在一中寫著,但它存在在多的那個表中)

  • OneToMany , ManyToOne 雙向(兩個注解一起用的):如果不在@OneToMany中加mappedy屬性就會產(chǎn)生中間表。

  • cascade屬性:指定級聯(lián)操作的行為(可多選)

    • CascadeType.PERSIST:級聯(lián)新增(又稱級聯(lián)保存):對A對象保存時也會對B對象進行保存。并且,只有A類新增時,會級聯(lián)B對象新增。若B對象在數(shù)據(jù)庫存在則拋異常。對應(yīng)EntityManager的presist方法。

    • CascadeType.MERGE:級聯(lián)合并(級聯(lián)更新):指A類新增或者變化,會級聯(lián)B對象(新增或者變化)。對應(yīng)EntityManager的merge方法。

    • CascadeType.REMOVE:級聯(lián)刪除:只有A類刪除時,會級聯(lián)刪除B類,即在設(shè)置的那一端進行刪除時,另一端才會級聯(lián)刪除。對應(yīng)EntityManager的remove方法。

    • CascadeType.REFRESH:級聯(lián)刷新:獲取A對象時也重新獲取最新的B對象。對EntityManager的refresh(object)方法。即會重新查詢數(shù)據(jù)庫里的最新數(shù)據(jù)(用的比較少)

    • CascadeType.DETACH:級聯(lián)分離。

    • CascadeType.ALL:級聯(lián)所有操作。

    示例(以級聯(lián)保存及刪除為例)

    Boss老板實體:

    @Entity public class Boss {@Id @GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@OneToMany(mappedBy = "boss")private List<Staff> staffList; }

    Staff員工實體:

    @Entity public class Staff {@Id @GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@ManyToOne private Boss boss; }

    不添加任何級聯(lián)

    執(zhí)行save保存操作,結(jié)果如下

    老板表:

    image.png

    員工表:

    image.png

    執(zhí)行的SQL:

    insert into boss (name) values ('張老板')

    PERSIST:級聯(lián)新增(又稱級聯(lián)保存)

    @OneToMany(mappedBy = "boss", cascade = CascadeType.PERSIST) private List<Staff> staffList;

    執(zhí)行save保存操作,結(jié)果如下

    老板表:

    image.png

    員工表:

    image.png ★

    員工已經(jīng)級聯(lián)保存,但是員工表中的boss_id卻是空,可見級聯(lián)是直接將set中的對象持久化到數(shù)據(jù)庫,而并沒有對關(guān)系進行維護(需要手動去維護)。

    執(zhí)行的SQL:

    insert into boss (name) values ('張老板') insert into staff (boss_id, name) values (1, '員工一') insert into staff (boss_id, name) values (1, '員工二')

    直接在數(shù)據(jù)庫中執(zhí)行SQL關(guān)系是維護好的

    REMOVE:級聯(lián)刪除

    @OneToMany(mappedBy = "boss", cascade = CascadeType.REMOVE) private List<Staff> staffList;

    執(zhí)行delete保存操作,結(jié)果如下

    老板表:

    員工表:

    image.png

    執(zhí)行的SQL

    select boss0_.id as id1_0_0_, boss0_.name as name2_0_0_ from boss boss0_ where boss0_.id=1select stafflist0_.boss_id as boss_id3_2_0_, stafflist0_.id as id1_2_0_, stafflist0_.id as id1_2_1_, stafflist0_.boss_id as boss_id3_2_1_, stafflist0_.name as name2_2_1_ from staff stafflist0_ where stafflist0_.boss_id=1delete from staff where id=1 delete from staff where id=2 delete from boss where id=1 ★

    老板表該條記錄刪除,同時員工表中的記錄也被級聯(lián)刪除。

    代碼

    https://github.com/panjiaqi1/Demo

    總結(jié)

    以上是生活随笔為你收集整理的Hibernate @OneToMany 及 @Cascade级联操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。