最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring jpa ManyToMany原理及用法詳解

 更新時(shí)間:2019年10月12日 08:27:48   作者:神更  
這篇文章主要介紹了spring jpa ManyToMany原理及用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

1.java和jpa 中所有的關(guān)系都是單向的。這個(gè)關(guān)系數(shù)據(jù)庫(kù)不同,關(guān)系數(shù)據(jù)庫(kù),通過(guò)外鍵定義并查詢,使得反向查詢總是存在的。

2.JPA還定義了一個(gè)OneToMany關(guān)系,它與ManyToMany關(guān)系類似,但反向關(guān)系(如果已定義)是ManyToOne關(guān)系。

OneToMany與JPA中ManyToMany關(guān)系的主要區(qū)別在于,ManyToMany總是使用中間關(guān)系連接表來(lái)存儲(chǔ)關(guān)系,

OneToMany可以使用連接表或者目標(biāo)對(duì)象的表引用中的外鍵源對(duì)象表的主鍵。

@OneToMany(cascade = CascadeType.ALL)
  @JoinColumn(name = "OPR_WARE_SYSCONFIG_ID",foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
  private List<WarehouseVO> warehouse;

wareHouseVO的表通過(guò)外鍵字段關(guān)聯(lián),而定義了OneToMany的屬性的VO則不需要添加表字段。

ManyToOne:

@ManyToOne
  @JoinColumn(name = "OPR_WAREHOUSE_ENV_ID")
  private EnvironmentVO env ;

總結(jié),作為many的一方需要有外鍵關(guān)聯(lián)One的一方。

@ManyToMany 注解

manyToMany需要和@JoinTable表結(jié)合使用,ManyToMany總是使用中間關(guān)系連接表來(lái)存儲(chǔ)關(guān)系。如果兩個(gè)Vo都定義了ManyToMany的話,因?yàn)閱蜗蜿P(guān)系,會(huì)生成有2個(gè)中間表。所以需要改造成雙向關(guān)系,使其只存在一個(gè)中間表。

例子:

a:一方不需要mappedBy屬性,一方需要。

@ManyToMany
  @JoinTable(name = "AUTO_SYSTEM", joinColumns = { @JoinColumn(name = "OPR_AUTO_ID") }, inverseJoinColumns = {
      @JoinColumn(name = "OPR_SYSTEM_ID") }, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT), inverseForeignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
  private List<SystemVO> systems;
@ManyToMany(mappedBy = "students")
private List<Service> services;

b:

@Entity
public class Student {
  @Id
  private String id;
  @ManyToMany
  @JoinTable
  private List<Teacher> teachers;
}
 
@Entity
public class Teacher {
  @Id
  private String id;
  @ManyToMany
  @JoinTable
  private List<Student> students;
}

@ManyToMany即表示了老師和學(xué)生的多對(duì)多關(guān)系。@ManyToMany注解可以用在字段或方法上

但是這樣會(huì)有兩個(gè)表出現(xiàn),TEACHER_STUDENTS表和STUDENT_TEACHERS。

原因是這里的多對(duì)多關(guān)系正是維基百科提到的單向原則。老師和學(xué)生雖然分別定義了自己的多對(duì)多關(guān)系,但這個(gè)關(guān)系都是單向的,要使關(guān)系成為雙向。

mappedBy 屬性

mappedBy是OneToOne、OneToMany和ManyToMany這三種關(guān)聯(lián)關(guān)系的屬性。

用來(lái)標(biāo)注擁有這種關(guān)系的字段。 除非關(guān)系是單向的,否則是必需的。

什么叫擁有關(guān)聯(lián)關(guān)系呢,假設(shè)是雙向一對(duì)一的話,那么擁有關(guān)系的這一方有建立、解除和更新與另一方關(guān)系的能力。而另一方?jīng)]有,只能被動(dòng)管理。

由于JoinTable和JoinColumn一般定義在擁有關(guān)系的這一端,而mappedBy一定是定義在關(guān)系的被擁有方(the owned side),也就是跟定義JoinTable

和JoinColumn互斥的一方,它的值指向擁有方中關(guān)于被擁有方的字段,可能是一個(gè)對(duì)象(OneToMany),也可能是一個(gè)對(duì)象集合(ManyToMany)。

@Entity
public class Student {
  @Id
  private String id;
  @ManyToMany(mappedBy = "students")
  private List<Teacher> teachers;
}
 
@Entity
public class Teacher {
  @Id
  private String id;
  @ManyToMany
  @JoinTable(“student”)
  private List<Student> students;
}

這時(shí)中間表只有一張TEACHER_STUDENTS,關(guān)聯(lián)關(guān)系也變成了我們想要的雙向關(guān)系。

Cascade 級(jí)聯(lián)關(guān)系

實(shí)際業(yè)務(wù)中,我們通常會(huì)遇到以下情況:

1.用戶和用戶的收貨地址是一對(duì)多關(guān)系,當(dāng)用戶被刪除時(shí),這個(gè)用戶的所有收貨地址也應(yīng)該一并刪除。

2.訂單和訂單中的商品也是一對(duì)多關(guān)系,但訂單被刪除時(shí),訂單所關(guān)聯(lián)的商品肯定不能被刪除。

此時(shí)只要配置正確的級(jí)聯(lián)關(guān)系,就能達(dá)到想要的效果。

級(jí)聯(lián)關(guān)系類型:

  • CascadeType.REFRESH:級(jí)聯(lián)刷新,當(dāng)多個(gè)用戶同時(shí)作操作一個(gè)實(shí)體,為了用戶取到的數(shù)據(jù)是實(shí)時(shí)的,在用實(shí)體中的數(shù)據(jù)之前就可以調(diào)用一下refresh()方法
  • CascadeType.REMOVE:級(jí)聯(lián)刪除,當(dāng)調(diào)用remove()方法刪除Order實(shí)體時(shí)會(huì)先級(jí)聯(lián)刪除OrderItem的相關(guān)數(shù)據(jù)
  • CascadeType.MERGE:級(jí)聯(lián)更新,當(dāng)調(diào)用了Merge()方法,如果Order中的數(shù)據(jù)改變了會(huì)相應(yīng)的更新OrderItem中的數(shù)據(jù)
  • CascadeType.ALL:包含以上所有級(jí)聯(lián)屬性
  • CascadeType.PERSIST:級(jí)聯(lián)保存,當(dāng)調(diào)用了Persist() 方法,會(huì)級(jí)聯(lián)保存相應(yīng)的數(shù)據(jù)

需要注意的是,CascadeType.ALL要謹(jǐn)慎使用,為了達(dá)到數(shù)據(jù)同步,很多人喜歡用CascadeType.ALL來(lái)實(shí)現(xiàn)。但上面訂單和商品的例子就不適用。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用IDEA搭建ssm框架的詳細(xì)圖文教程

    使用IDEA搭建ssm框架的詳細(xì)圖文教程

    這篇文章主要介紹了使用IDEA搭建ssm框架的詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java?windows環(huán)境構(gòu)建圖文教程

    Java?windows環(huán)境構(gòu)建圖文教程

    這篇文章主要為大家介紹了Java?windows環(huán)境構(gòu)建圖文教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2023-12-12
  • SpringMVC項(xiàng)目異常處理機(jī)制詳解

    SpringMVC項(xiàng)目異常處理機(jī)制詳解

    SpringMVC是一種基于Java,實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式,請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進(jìn)行職責(zé)解耦。基于請(qǐng)求驅(qū)動(dòng)指的就是使用請(qǐng)求-響應(yīng)模型,框架的目的就是幫助我們簡(jiǎn)化開發(fā),SpringMVC也是要簡(jiǎn)化我們?nèi)粘eb開發(fā)
    2022-08-08
  • java方法重載示例

    java方法重載示例

    方法重載是以統(tǒng)一的方式處理不同數(shù)據(jù)類型的一種手段,這篇文章主要介紹了java方法重載示例,需要的朋友可以參考下
    2014-03-03
  • java實(shí)現(xiàn)在原有日期時(shí)間上加幾個(gè)月或幾天

    java實(shí)現(xiàn)在原有日期時(shí)間上加幾個(gè)月或幾天

    這篇文章主要介紹了java實(shí)現(xiàn)在原有日期時(shí)間上加幾個(gè)月或幾天,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • java 如何計(jì)算同比增長(zhǎng)工具類

    java 如何計(jì)算同比增長(zhǎng)工具類

    這篇文章主要介紹了java 如何計(jì)算同比增長(zhǎng)工具類的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot攔截器Filter的使用方法詳解

    SpringBoot攔截器Filter的使用方法詳解

    這篇文章主要介紹了SpringBoot攔截器Filter的使用方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 初探Spring Cloud Gateway實(shí)戰(zhàn)

    初探Spring Cloud Gateway實(shí)戰(zhàn)

    這篇文章主要介紹了創(chuàng)建網(wǎng)關(guān)項(xiàng)目(Spring Cloud Gateway)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Java通過(guò)正則表達(dá)式捕獲組中的文本

    Java通過(guò)正則表達(dá)式捕獲組中的文本

    這篇文章主要給大家介紹了關(guān)于利用Java如何通過(guò)正則表達(dá)式捕獲組中文本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧下
    2019-09-09
  • java中文亂碼之解決URL中文亂碼問(wèn)題的方法

    java中文亂碼之解決URL中文亂碼問(wèn)題的方法

    這篇文章主要為大家分享了介紹了java中文亂碼之解決URL中文亂碼問(wèn)題的方法,感興趣的小伙伴們可以參考一下
    2016-06-06

最新評(píng)論

和政县| 安康市| 松原市| 亚东县| 松桃| 望谟县| 徐水县| 桂东县| 定边县| 江安县| 牟定县| 浪卡子县| 松江区| 大同市| 通化县| 连平县| 清镇市| 嘉祥县| 庆元县| 塔河县| 武强县| 金沙县| 鹰潭市| 庆城县| 杂多县| 肃宁县| 新乡市| 巴彦县| 玛曲县| 迭部县| 辽源市| 乌鲁木齐县| 麟游县| 靖西县| 桐庐县| 手游| 冕宁县| 寻甸| 海南省| 湘西| 华坪县|