對(duì)Jpa中Entity關(guān)系映射中mappedBy的全面理解
對(duì)Jpa Entity關(guān)系映射中mappedBy的理解
mappedBy 單向關(guān)系不需要設(shè)置該屬性,雙向關(guān)系必須設(shè)置,避免雙方都建立外鍵字段數(shù)據(jù)庫中1對(duì)多的關(guān)系,關(guān)聯(lián)關(guān)系總是被多方維護(hù)的即外鍵建在多方,我們?cè)趩畏綄?duì)象的@OneToMany(mappedby="")把關(guān)系的維護(hù)交給多方對(duì)象的屬性去維護(hù)關(guān)系。
對(duì)于mappedBy復(fù)習(xí)下
a) 只有OneToOne,OneToMany,ManyToMany上才有mappedBy屬性,ManyToOne不存在該屬性;
b) mappedBy標(biāo)簽一定是定義在the owned side(被擁有方的),他指向theowning side(擁有方);
c) 關(guān)系的擁有方負(fù)責(zé)關(guān)系的維護(hù),在擁有方建立外鍵。所以用到@JoinColumn
d)mappedBy跟JoinColumn/JoinTable總是處于互斥的一方
這里的維護(hù)關(guān)聯(lián)關(guān)系,拿多對(duì)多來說就是中間表,在不設(shè)置cascade的情況下,中間表由負(fù)責(zé)維護(hù)關(guān)聯(lián)關(guān)系的一方維護(hù)
舉例說明
Game 和User 兩個(gè)實(shí)體類,他們是多對(duì)多的關(guān)系,有中間表t_game-user.
在User中配置有:
@ManyToMany(mappedBy="users") public List<Game> getGames() { return games; }
Game中配置有:
@ManyToMany @JoinTable(name = "t_game_user", joinColumns = {@JoinColumn(name = "game_id",referencedColumnName="gameId")}, inverseJoinColumns = {@JoinColumn(name = "user_id",referencedColumnName="id")}) public List<User> getUsers() { return users; }
所以說由Game來維護(hù)他們的關(guān)聯(lián)關(guān)系,即中間表。表現(xiàn)形式:
1.因?yàn)闆]有配置cascade所以分別給Game,User添加4條數(shù)據(jù),然后手動(dòng)在中間表中添加他們的關(guān)聯(lián)關(guān)系
2.在程序中執(zhí)行刪除User
Hibernate: delete from t_user where id=? Hibernate: delete from t_user where id=? Hibernate: delete from t_user where id=? Hibernate: delete from t_user where id=?
刪除了User,并沒有對(duì)中間表發(fā)生影響
在程序中執(zhí)行刪除Game
Hibernate:delete from t_game_user where game_id=? Hibernate:delete from t_game_user where game_id=? Hibernate:delete from t_game_user where game_id=? Hibernate:delete from t_game_user where game_id=? Hibernate:delete from t_game where game_id=? Hibernate:delete from t_game where game_id=? Hibernate:delete from t_game where game_id=? Hibernate:delete from t_game where game_id=?
對(duì)中間表產(chǎn)生了影響,說明是Game在維護(hù)他們之間的關(guān)聯(lián)關(guān)系
Spring-jpa中mappedBy的作用
mappedBy主要用于需要外鍵(存在于@OneToOne,@OneToMany,@ManyToMany中)的場景下,幫助我們進(jìn)行外鍵管理。
使用@JoinColumn存在的問題
在“一對(duì)多”的場景下,如果不使用mappedby,則一般是在“一方”和“多方”分別使用@joinColumn注解,幫助我們?cè)凇岸喾健焙汀耙环健边M(jìn)行外鍵的維護(hù),這樣做的好處去掉多出來的一張關(guān)系映射表。
但是這會(huì)產(chǎn)生一個(gè)問題,就是執(zhí)行的時(shí)候因?yàn)閮煞蕉家S護(hù)外鍵,所以在進(jìn)行數(shù)據(jù)的增刪時(shí)會(huì)執(zhí)行冗余的update語句(update”多方“的外鍵),這些update語句是沒有必要的。
因此,問題的解決就是需要我們只在“多方”來維護(hù)外鍵,為什么不在“一方'維護(hù)外鍵,因?yàn)檫@樣”一方“為了維護(hù)外鍵還是會(huì)執(zhí)行多余的update語句。
使用mappedBy
所以,我們需要在@OneToMany上使用mappedBy,值一般設(shè)為“多方”Entity類的外鍵數(shù)據(jù)成員名(注意不是數(shù)據(jù)庫上的字段名,同時(shí)必須去掉@JoinColumn,不然會(huì)產(chǎn)生沖突)。這樣就將外鍵的維護(hù)權(quán)交給“多方”,多方還是要使用@JoinColumn,并將值設(shè)為外鍵字段名,不然系統(tǒng)會(huì)自動(dòng)幫我們?cè)O(shè)置一個(gè)外鍵字段。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java 數(shù)據(jù)結(jié)構(gòu)七大排序使用分析
這篇文章主要介紹了Java常用的排序算法及代碼實(shí)現(xiàn),在Java開發(fā)中,對(duì)排序的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時(shí)候能夠有扎實(shí)的基礎(chǔ)能力。那Java有哪些排序算法呢?本文小編就來詳細(xì)說說Java常見的排序算法,需要的朋友可以參考一下2022-04-04Vue.Js及Java實(shí)現(xiàn)文件分片上傳代碼實(shí)例
這篇文章主要介紹了Vue.Js及Java實(shí)現(xiàn)文件分片上傳代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06SpringBoot 項(xiàng)目中的圖片處理策略之本地存儲(chǔ)與路徑映射
在SpringBoot項(xiàng)目中,靜態(tài)資源存放在static目錄下,使得前端可以通過URL來訪問這些資源,我們就需要將文件系統(tǒng)的文件路徑與URL建立一個(gè)映射關(guān)系,把文件系統(tǒng)中的文件當(dāng)成我們的靜態(tài)資源即可,本文給大家介紹SpringBoot本地存儲(chǔ)與路徑映射的相關(guān)知識(shí),感興趣的朋友一起看看吧2023-12-12Java PDF 添加數(shù)字簽名的實(shí)現(xiàn)方法
這篇文章主要介紹了Java PDF 添加數(shù)字簽名的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Spring?Boot讀取配置文件內(nèi)容的3種方式(@Value、Environment和@ConfigurationP
工作中經(jīng)常會(huì)有一些參數(shù)需要配置,同時(shí)在代碼里面需要用到,所有就需要配置類讀取,然后在使用的時(shí)候注入該類進(jìn)行獲取相關(guān)參數(shù),下面這篇文章主要給大家介紹了關(guān)于Spring?Boot讀取配置文件內(nèi)容的3種方式,需要的朋友可以參考下2023-01-01mybatis-plus多表聯(lián)查join的實(shí)現(xiàn)
本文主要介紹了mybatis-plus多表聯(lián)查join的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Java讀取制表符文本轉(zhuǎn)換為JSON實(shí)現(xiàn)實(shí)例
在Java開發(fā)中,處理各種數(shù)據(jù)格式是常見的任務(wù),本文將介紹如何使用Java讀取制表符文本文件,并將其轉(zhuǎn)換為JSON格式,以便于后續(xù)的數(shù)據(jù)處理和分析,我們將使用Java中的相關(guān)庫來實(shí)現(xiàn)這個(gè)過程,并提供詳細(xì)的代碼示例2024-01-01