SpringDataJPA實(shí)體類(lèi)關(guān)系映射配置方式
SpringDataJPA
//FetchType.LAZY:懶加載,加載一個(gè)實(shí)體時(shí),定義懶加載的屬性不會(huì)馬上從數(shù)據(jù)庫(kù)中加載 //FetchType.EAGER:急加載,加載一個(gè)實(shí)體時(shí),定義急加載的屬性會(huì)立即從數(shù)據(jù)庫(kù)中加載 //cascade = CascadeType.ALL 表示所有情況下均進(jìn)行關(guān)聯(lián)操作,即save-update和delete @JsonBackReference //解決循環(huán)引用問(wèn)題 @JsonIgnoreProperties(value = "order") //解決循環(huán)引用問(wèn)題,order內(nèi)容大,不加載 //雙向映射存在轉(zhuǎn)json無(wú)限遞歸問(wèn)題 需要注解來(lái)處理 推薦使用第二個(gè)注解 value值為對(duì)方表作映射的變量值
1.單向一對(duì)一映射
一方
//教師 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; private String name; private long salary; @OneToOne @JoinColumn(name="PSPACE_ID") private ParkingSpace parkingSpace;
一方
//停車(chē)場(chǎng) @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; private int lot; private String location;
總結(jié)
添加時(shí)候需要先添加@OneToOne的那方,刪除也是。
2.雙向一對(duì)一映射
一方
//人員 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private long id; private String name; @OneToOne @JoinColumn(name="DEPT_ID") @JsonIgnoreProperties(value = "person") private Department department;
一方
//部門(mén) @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private long id; private String name; @OneToOne(mappedBy="department") @JsonIgnoreProperties(value = "department") private Person person;
總結(jié)
@JsonBackReference //解決循環(huán)引用問(wèn)題 @JsonIgnoreProperties(value = "order") //解決循環(huán)引用問(wèn)題,order內(nèi)容大,不加載 //雙向映射存在轉(zhuǎn)json無(wú)限遞歸問(wèn)題 需要注解來(lái)處理 推薦使用第二個(gè)注解 value值為對(duì)方表作映射的變量值
3.單向一對(duì)多映射
一方
@Id @GeneratedValue private Long id; @Column(length = 32) private String name; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)//級(jí)聯(lián)保存、更新、刪除、刷新;延遲加載 @JoinColumn(name = "author_id")//在book表增加一個(gè)外鍵列來(lái)實(shí)現(xiàn)一對(duì)多的單向關(guān)聯(lián) private Set<Book> books = new HashSet<Book>();
多方
//單向一對(duì)多的情況下 多方不需要加任何關(guān)聯(lián)標(biāo)識(shí) @Id @GeneratedValue private Long id; @Column(length=32) private String name;
總結(jié)
因?yàn)槭菃蜗虻年P(guān)聯(lián),多方不需要加任何的關(guān)聯(lián)標(biāo)識(shí) 只需要在一方添加即可
4.雙向一對(duì)多映射
一方
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; //主鍵 private String name; //姓名 //描述客戶(hù)可以有多個(gè)訂單 @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL) @JsonBackReference private Set<Order> order = new HashSet<Order>();
多方
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private Double money; private String receiverInfo; //收貨地址 // 訂單與客戶(hù)關(guān)聯(lián) @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "c_id") //指定外鍵列 @JsonIgnoreProperties(value = "order") //解決循環(huán)引用問(wèn)題,order內(nèi)容大,不加載 private Customer customer; //描述訂單屬于某一個(gè)客戶(hù)
總結(jié)
@JsonBackReference //解決循環(huán)引用問(wèn)題 @JsonIgnoreProperties(value = "order") //解決循環(huán)引用問(wèn)題,order內(nèi)容大,不加載 //雙向映射存在轉(zhuǎn)json無(wú)限遞歸問(wèn)題 需要注解來(lái)處理 推薦使用第二個(gè)注解 value值為對(duì)方表作映射的變量值
5.單向多對(duì)一映射
多方
@GeneratedValue @Id private Integer id; @Column(name="ORDER_NAME") private String orderName; //映射單向 n-1的關(guān)聯(lián)關(guān)系 //使用@ManyToOne來(lái)映射多對(duì)一的關(guān)聯(lián)關(guān)系 //使用@JoinColumn 來(lái)映射外鍵 //可使用 @ManyToOne 的fetch 屬性來(lái)修改默認(rèn)的關(guān)聯(lián)屬性的加載策略 @JoinColumn(name="CUSTOMER_ID") //此外鍵為一方的主鍵 @ManyToOne(fetch=FetchType.EAGER) private Customer customer;
一方
//單向多對(duì)一的情況下,一方不需要加任何關(guān)聯(lián)標(biāo)識(shí) @GeneratedValue(strategy=GenerationType.AUTO) @Id private Integer id; private String lastName; private String email; private int age; private Date createdTime; private Date birth;
總結(jié)
保存多對(duì)一時(shí),建議先保存1的一端,后保存n的一端,這樣不會(huì)多出額外的update語(yǔ)句。
6.雙向多對(duì)一映射
多方
@GeneratedValue @Id private Integer id; @Column(name="ORDER_NAME") private String orderName; //映射單向 n-1的關(guān)聯(lián)關(guān)系 //使用@ManyToOne來(lái)映射多對(duì)一的關(guān)聯(lián)關(guān)系 //使用@JoinColumn 來(lái)映射外鍵 //可使用 @ManyToOne 的fetch 屬性來(lái)修改默認(rèn)的關(guān)聯(lián)屬性的加載策略 @JoinColumn(name="CUSTOMER_ID") @ManyToOne(fetch=FetchType.EAGER) @JsonIgnoreProperties(value = {"customer","orders"}) private Customer customer;
一方
@GeneratedValue(strategy=GenerationType.AUTO) @Id private Integer id; @Column(name="LAST_NAME",length=50,nullable=false) private String lastName; private String email; private int age; //定義日期格式 @Temporal(TemporalType.TIMESTAMP) private Date createdTime; @Temporal(TemporalType.DATE) private Date birth; //映射單向1-n的關(guān)聯(lián)關(guān)系 //使用@OneToMany 映射單向1-n的關(guān)聯(lián)關(guān)系 //使用@JoinColumn 來(lái)映射外鍵的名稱(chēng) //可以使用@OneToMany 的 fetch 屬性來(lái)修改加載策略 //可以使用@OneToMany 的 cascade 屬性來(lái)修改默認(rèn)的刪除策略 // @JoinColumn(name="CUSTOMER_ID") //一的一端放棄維持關(guān)聯(lián)關(guān)系 @OneToMany(fetch=FetchType.EAGER,cascade={CascadeType.REMOVE},mappedBy="customer") @JsonIgnoreProperties(value = "orders") private Set<Order> orders = new HashSet<>();
總結(jié)
1.必須使用@JsonIgnoreProperties注解來(lái)攔截轉(zhuǎn)json時(shí)無(wú)限遞歸的問(wèn)題
2.若是雙向 1-n 的關(guān)聯(lián)關(guān)系, 執(zhí)行保存時(shí):
(1)若先保存 n 的一端, 再保存 1 的一端, 默認(rèn)情況下, 會(huì)多出2n 條 UPDATE 語(yǔ)句;
(2)若先保存 1 的一端, 則會(huì)多出 n 條 UPDATE 語(yǔ)句。
(3)故在進(jìn)行雙向 1-n 關(guān)聯(lián)關(guān)系時(shí), 建議使用 n 的一方來(lái)維護(hù)關(guān)聯(lián)關(guān)系, 而 1 的一方不維護(hù)關(guān)聯(lián)系, 這樣會(huì)有效的減少 SQL 語(yǔ)句(即,N的一端對(duì)應(yīng)的表中使用外鍵關(guān)聯(lián)1的一端,外鍵對(duì)應(yīng)1的一端的表主鍵)
注意:若在 1 的一端的 @OneToMany 中使用 mappedBy 屬性, 則 @OneToMany 端就不能再使用 @JoinColumn 屬性了。
7.單向多對(duì)多映射
多方
@Id @GeneratedValue private Long id; private String name; // 表示多對(duì)多 @ManyToMany(cascade = CascadeType.ALL) // 中間表的表名 @JoinTable(name = "t_user_role", joinColumns = {@JoinColumn(name = "user_id")}, //反轉(zhuǎn) user這個(gè)表的 反面則是 role inverseJoinColumns = {@JoinColumn(name = "role_id")}) private Set<Role> roles = new HashSet<>();
多方
@Id @GeneratedValue private Long id; private String name;
總結(jié)
使用 @JoinTable
來(lái)映射中間表
1. name
指向中間表的名字
2. joinColumns
映射當(dāng)前類(lèi)所在的表在中間表中的外鍵
2.1 name
指定外鍵列的列名
2.2 referencedColumnName
指定外鍵列關(guān)聯(lián)當(dāng)前表的哪一列
3. inverseJoinColumns
映射關(guān)聯(lián)的類(lèi)所在中間表的外鍵
8.雙向多對(duì)多映射
多方
@Id @GeneratedValue private Long id; private String name; // 表示多對(duì)多 @ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.REMOVE) @JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="user_id")}, inverseJoinColumns ={@JoinColumn(name="role_id")} ) @JsonIgnoreProperties(value = "users") private Set<Role> roles = new HashSet<>()
多方
@Id @GeneratedValue private Long id; private String name; @ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL) @JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="role_id")}, inverseJoinColumns ={@JoinColumn(name="user_id")} ) @JsonIgnoreProperties(value = "roles") private Set<User> users = new HashSet<>();
總結(jié)
使用 @JoinTable
來(lái)映射中間表
1. name
指向中間表的名字
2. joinColumns
映射當(dāng)前類(lèi)所在的表在中間表中的外鍵
2.1 name
指定外鍵列的列名
2.2 referencedColumnName
指定外鍵列關(guān)聯(lián)當(dāng)前表的哪一列
3. inverseJoinColumns
映射關(guān)聯(lián)的類(lèi)所在中間表的外鍵
@JsonBackReference //解決循環(huán)引用問(wèn)題 @JsonIgnoreProperties(value = "order") //解決循環(huán)引用問(wèn)題,order內(nèi)容大,不加載
雙向映射存在轉(zhuǎn)json無(wú)限遞歸問(wèn)題 需要注解來(lái)處理 推薦使用第二個(gè)注解 value值為對(duì)方表作映射的變量值
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JVM垃圾回收機(jī)制和垃圾回收器詳細(xì)解說(shuō)
這篇文章主要介紹了JVM垃圾回收機(jī)制和垃圾回收器,為了讓程序員更加專(zhuān)注于代碼的實(shí)現(xiàn),而不用過(guò)多的考慮內(nèi)存釋放的問(wèn)題,所以在Java語(yǔ)言中,有了自動(dòng)的垃圾回收機(jī)制,也是我們常常提及的GC,需要的朋友可以參考下2022-07-07Javaweb實(shí)現(xiàn)上傳下載文件的多種方法
本篇文章主要介紹了Javaweb實(shí)現(xiàn)上傳下載文件,有多種實(shí)現(xiàn)方式,需要的朋友可以參考下。2016-10-10Java編程幾個(gè)循環(huán)實(shí)例代碼分享
這篇文章主要介紹了Java編程幾個(gè)循環(huán)實(shí)例代碼分享,多看多練,小編覺(jué)得還是挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-10-10深度解析SpringBoot中@Async引起的循環(huán)依賴(lài)
本文主要介紹了深度解析SpringBoot中@Async引起的循環(huán)依賴(lài),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02SpringBoot實(shí)現(xiàn)自定義指標(biāo)監(jiān)控功能
本文主要介紹了SpringBoot實(shí)現(xiàn)自定義指標(biāo)監(jiān)控功能的實(shí)現(xiàn),,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,感興趣的小伙伴跟著著小編來(lái)一起來(lái)學(xué)習(xí)吧2024-01-01關(guān)于@MapperScan和@ComponentScan的使用問(wèn)題
文章介紹了在使用`@MapperScan`和`@ComponentScan`時(shí)可能會(huì)遇到的包掃描沖突問(wèn)題,并提供了解決方法,同時(shí),還詳細(xì)解釋了`@MapperScan`和`@ComponentScan`的功能和使用場(chǎng)景2025-01-01idea 自動(dòng)生成類(lèi)注釋和方法注釋的實(shí)現(xiàn)步驟
這篇文章主要介紹了idea 自動(dòng)生成類(lèi)注釋和方法注釋的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Java?深入理解創(chuàng)建型設(shè)計(jì)模式之抽象工廠模式
當(dāng)系統(tǒng)所提供的工廠所需生產(chǎn)的具體產(chǎn)品并不是一個(gè)簡(jiǎn)單的對(duì)象,而是多個(gè)位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中屬于不同類(lèi)型的具體產(chǎn)品時(shí)需要使用抽象工廠模式,抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態(tài)2022-02-02mybatisplus 多表關(guān)聯(lián)條件分頁(yè)查詢(xún)的實(shí)現(xiàn)
本文主要介紹了mybatisplus 多表關(guān)聯(lián)條件分頁(yè)查詢(xún)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01關(guān)于junit單元測(cè)試@Test的使用方式
這篇文章主要介紹了關(guān)于junit單元測(cè)試@Test的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07