溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SpringDataJPA實(shí)體類關(guān)系映射配置方式有哪些

發(fā)布時(shí)間:2021-12-06 12:18:33 來源:億速云 閱讀:181 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)SpringDataJPA實(shí)體類關(guān)系映射配置方式有哪些,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

SpringDataJPA

//FetchType.LAZY:懶加載,加載一個(gè)實(shí)體時(shí),定義懶加載的屬性不會(huì)馬上從數(shù)據(jù)庫中加載
//FetchType.EAGER:急加載,加載一個(gè)實(shí)體時(shí),定義急加載的屬性會(huì)立即從數(shù)據(jù)庫中加載
//cascade = CascadeType.ALL 表示所有情況下均進(jìn)行關(guān)聯(lián)操作,即save-update和delete
@JsonBackReference   //解決循環(huán)引用問題
@JsonIgnoreProperties(value = "order") //解決循環(huán)引用問題,order內(nèi)容大,不加載
//雙向映射存在轉(zhuǎn)json無限遞歸問題 需要注解來處理 推薦使用第二個(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ǎ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;

一方

  //部門
  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  private long id;
  private String name;
  @OneToOne(mappedBy="department")
  @JsonIgnoreProperties(value = "department")
  private Person person;

總結(jié)

@JsonBackReference   //解決循環(huán)引用問題
@JsonIgnoreProperties(value = "order") //解決循環(huán)引用問題,order內(nèi)容大,不加載
//雙向映射存在轉(zhuǎn)json無限遞歸問題 需要注解來處理 推薦使用第二個(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è)外鍵列來實(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; //姓名
    //描述客戶可以有多個(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; //收貨地址
    // 訂單與客戶關(guān)聯(lián)
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "c_id") //指定外鍵列  
    @JsonIgnoreProperties(value = "order") //解決循環(huán)引用問題,order內(nèi)容大,不加載
    private Customer customer; //描述訂單屬于某一個(gè)客戶

總結(jié)

@JsonBackReference   //解決循環(huán)引用問題
@JsonIgnoreProperties(value = "order") //解決循環(huán)引用問題,order內(nèi)容大,不加載
//雙向映射存在轉(zhuǎn)json無限遞歸問題 需要注解來處理 推薦使用第二個(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來映射多對(duì)一的關(guān)聯(lián)關(guān)系
 //使用@JoinColumn 來映射外鍵
 //可使用 @ManyToOne 的fetch 屬性來修改默認(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語句。

6.雙向多對(duì)一映射

多方

 @GeneratedValue
 @Id
 private Integer id;
 @Column(name="ORDER_NAME")
 private String orderName;
 //映射單向 n-1的關(guān)聯(lián)關(guān)系
 //使用@ManyToOne來映射多對(duì)一的關(guān)聯(lián)關(guān)系
 //使用@JoinColumn 來映射外鍵
 //可使用 @ManyToOne 的fetch 屬性來修改默認(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 來映射外鍵的名稱
    //可以使用@OneToMany 的 fetch 屬性來修改加載策略
    //可以使用@OneToMany 的 cascade 屬性來修改默認(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注解來攔截轉(zhuǎn)json時(shí)無限遞歸的問題

2.若是雙向 1-n 的關(guān)聯(lián)關(guān)系, 執(zhí)行保存時(shí):

(1)若先保存 n 的一端, 再保存 1 的一端, 默認(rèn)情況下, 會(huì)多出2n 條 UPDATE 語句;

(2)若先保存 1 的一端, 則會(huì)多出 n 條 UPDATE 語句。

(3)故在進(jìn)行雙向 1-n 關(guān)聯(lián)關(guān)系時(shí), 建議使用 n 的一方來維護(hù)關(guān)聯(lián)關(guān)系, 而 1 的一方不維護(hù)關(guān)聯(lián)系, 這樣會(huì)有效的減少 SQL 語句(即,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 來映射中間表

1. name 指向中間表的名字

2. joinColumns 映射當(dāng)前類所在的表在中間表中的外鍵

2.1 name 指定外鍵列的列名

2.2 referencedColumnName 指定外鍵列關(guān)聯(lián)當(dāng)前表的哪一列

3. inverseJoinColumns 映射關(guān)聯(lián)的類所在中間表的外鍵

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 來映射中間表

1. name 指向中間表的名字

2. joinColumns 映射當(dāng)前類所在的表在中間表中的外鍵

2.1 name 指定外鍵列的列名

2.2 referencedColumnName 指定外鍵列關(guān)聯(lián)當(dāng)前表的哪一列

3. inverseJoinColumns 映射關(guān)聯(lián)的類所在中間表的外鍵

@JsonBackReference //解決循環(huán)引用問題
@JsonIgnoreProperties(value = "order") //解決循環(huán)引用問題,order內(nèi)容大,不加載

雙向映射存在轉(zhuǎn)json無限遞歸問題 需要注解來處理 推薦使用第二個(gè)注解 value值為對(duì)方表作映射的變量值

關(guān)于“SpringDataJPA實(shí)體類關(guān)系映射配置方式有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI