欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

對(duì)Jpa中Entity關(guān)系映射中mappedBy的全面理解

 更新時(shí)間:2021年12月06日 09:53:17   作者:ido  
這篇文章主要介紹了對(duì)Jpa中Entity關(guān)系映射中mappedBy的全面理解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

對(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í)現(xiàn)線性表及其算法

    java實(shí)現(xiàn)線性表及其算法

    線性表是最簡單和最常用的一種數(shù)據(jù)結(jié)構(gòu),它是有n個(gè)體數(shù)據(jù)元素(節(jié)點(diǎn))組成的有限序列,這篇文章主要介紹了java實(shí)現(xiàn)線性表及其算法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • 新手初學(xué)Java-Map

    新手初學(xué)Java-Map

    Map簡介:將鍵映射到值的對(duì)象。一個(gè)映射不能包含重復(fù)的鍵;每個(gè)鍵最多只能映射到一個(gè)值。此接口取代 Dictionary 類,后者完全是一個(gè)抽象類,而不是一個(gè)接口
    2021-07-07
  • Java 數(shù)據(jù)結(jié)構(gòu)七大排序使用分析

    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-04
  • springcloud?整合?openfeign的方法

    springcloud?整合?openfeign的方法

    openFeign 是springcloud對(duì)Feign進(jìn)行了增強(qiáng),使得Feign支持了springmvc的注解,并整合了Ribbon和Eureka,從而讓Feign的使用更加方便,這篇文章主要介紹了springcloud?整合?openfeign,需要的朋友可以參考下
    2022-09-09
  • Vue.Js及Java實(shí)現(xiàn)文件分片上傳代碼實(shí)例

    Vue.Js及Java實(shí)現(xiàn)文件分片上傳代碼實(shí)例

    這篇文章主要介紹了Vue.Js及Java實(shí)現(xiàn)文件分片上傳代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • SpringBoot 項(xiàng)目中的圖片處理策略之本地存儲(chǔ)與路徑映射

    SpringBoot 項(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-12
  • Java PDF 添加數(shù)字簽名的實(shí)現(xiàn)方法

    Java PDF 添加數(shù)字簽名的實(shí)現(xiàn)方法

    這篇文章主要介紹了Java PDF 添加數(shù)字簽名的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Spring?Boot讀取配置文件內(nèi)容的3種方式(@Value、Environment和@ConfigurationProperties)

    Spring?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-01
  • mybatis-plus多表聯(lián)查join的實(shí)現(xiàn)

    mybatis-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-01
  • Java讀取制表符文本轉(zhuǎn)換為JSON實(shí)現(xiàn)實(shí)例

    Java讀取制表符文本轉(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

最新評(píng)論