1. 程式人生 > >使用@ManyToMany查詢資料時的死迴圈問題解決辦法

使用@ManyToMany查詢資料時的死迴圈問題解決辦法

初學使用spring data jpa,將問題記錄

以User 和Role為例,兩者為雙向的多對多關係,即可以通過User查詢到Role資訊,也可以通過Role查詢到User資訊

首先要明白為什麼會出現死迴圈這個問題,造成這個死迴圈的原因是因為查詢User時,包含了Role屬性,Role中又需要查詢除user屬性,這個不是spring data jpa  的問題,而是隻要程式碼裡互相關聯都會造成這種情況,解決這種情況的方法我大概研究出了兩種

一、在Role中加上@JsonIgnore註解,程式碼如下

User.java


package com.example.demo.entity;
import lombok.Data;


import javax.persistence.*;
import java.util.Set;

/**
 * @author lidai
 * @date 2018/10/23 13:53
 */
@Entity
@Data
@Table(name = "t_user")
public class User {

    @Id
    private String userId;

    private String username;

    private String password;

    @ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinTable(name = "t_user_role",
            joinColumns = @JoinColumn(name = "user_id",referencedColumnName = "userId"),
            inverseJoinColumns = @JoinColumn(name = "role_id",referencedColumnName = "roleId"))
    private Set<Role> roleSet;


}

Role.java


package com.example.demo.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;

import javax.persistence.*;
import java.util.Set;

/**
 * @author lidai
 * @date 2018/10/29 14:15
 */
@Entity
@Table(name = "t_role")
@Data
public class Role {

    @Id
    @GeneratedValue
    private String roleId;

    private String roleName;

    private String remark;

    @JsonIgnore
    @ManyToMany(fetch = FetchType.LAZY,mappedBy = "roleSet")
    private Set<User> userSet;

}

很多初學者可能對@ManyToMany這個註解存在一些疑惑,下面給出我的理解僅供參考

@ManyToMany代表多對多的關聯關係

cascade 屬性

  • CascadeType.ALL:級聯包含所有持久化方法
  • CascadeType.PERSIST只有A類新增時,會級聯B物件新增。若B物件在資料庫存(跟新)在則拋異常(讓B變為持久態)
  • CascadeType.MERGE指A類新增或者變化,會級聯B物件(新增或者變化)
  • CascadeType.REMOVE只有A類刪除時,會級聯刪除B類; 

@JoinTable關聯中間表,如User與Role的中間表為t_user_role

  • name:中間表名
  • JoinColumns:中間表與第一張表關聯的外來鍵(第一張表在user中即為user表)
  • inverseJoinColumns:與JoinColumns類似,為第二張表關聯的外來鍵

fetch

  • FetchType.EAGER:立即載入
  • FetchType.LAZY:懶載入

mappedBy = "roleSet":roleSet幾位User表中的List<Role>屬性名

以上為第一種解決方法

 

二,將雙向關聯改為單向關聯

刪除Role表中的如下程式碼即可

    @JsonIgnore
    @ManyToMany(fetch = FetchType.LAZY,mappedBy = "roleSet")
    private Set<User> userSet;

只不過單向關聯時不能通過Role查詢到User的資訊