解決使用@ManyToMany查詢數(shù)據(jù)時的死循環(huán)問題
使用@ManyToMany查詢數(shù)據(jù)時的死循環(huán)
初學使用spring data jpa,將問題記錄
以User 和Role為例,兩者為雙向的多對多關(guān)系,即可以通過User查詢到Role信息,也可以通過Role查詢到User信息
首先要明白為什么會出現(xiàn)死循環(huán)這個問題,造成這個死循環(huán)的原因是因為查詢User時,包含了Role屬性,Role中又需要查詢除user屬性,這個不是spring data jpa 的問題,而是只要代碼里互相關(guān)聯(lián)都會造成這種情況,解決這種情況的方法我大概研究出了兩種
一、在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 = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id",referencedColumnName = "role_id"))
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
@EqualsAndHashCode(exclude = {"userSet"})
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代表多對多的關(guān)聯(lián)關(guān)系
cascade 屬性
CascadeType.ALL:級聯(lián)包含所有持久化方法CascadeType.PERSIST只有A類新增時,會級聯(lián)B對象新增。若B對象在數(shù)據(jù)庫存(跟新)在則拋異常(讓B變?yōu)槌志脩B(tài))CascadeType.MERGE指A類新增或者變化,會級聯(lián)B對象(新增或者變化)CascadeType.REMOVE只有A類刪除時,會級聯(lián)刪除B類;
@JoinTable關(guān)聯(lián)中間表,如User與Role的中間表為t_user_role
name:中間表名JoinColumns:中間表與第一張表關(guān)聯(lián)的外鍵(第一張表在user中即為user表)inverseJoinColumns:與JoinColumns類似,為第二張表關(guān)聯(lián)的外鍵
fetch
FetchType.EAGER:立即加載FetchType.LAZY:懶加載
mappedBy = "roleSet":roleSet幾位User表中的List<Role>屬性名
以上為第一種解決方法
二、將雙向關(guān)聯(lián)改為單向關(guān)聯(lián)
刪除Role表中的如下代碼即可
@JsonIgnore
@ManyToMany(fetch = FetchType.LAZY,mappedBy = "roleSet")
private Set<User> userSet;
只不過單向關(guān)聯(lián)時不能通過Role查詢到User的信息
單向多對多@ManyToMany的使用和理解
- 單向多對多:就是一個實體類可以獲取到另外一個實體類
- 多對多:一個員工可以擁有多個角色,一個角色可以對應(yīng)多個員工
//角色單向多對多:配置中間表
//多對多:一個員工可以擁有多個角色,一個角色可以對應(yīng)多個員工
@ManyToMany(fetch = FetchType.LAZY)//配置懶加載
//JoinTable是中間表表名,joinColumns指定中間表中關(guān)聯(lián)自己ID的字段, joinColumn是列名,inverseJoinColumns表示中間表中關(guān)聯(lián)對方ID的字段。
@JoinTable(name = "employee_role",joinColumns = @JoinColumn(name = "employee_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
@JsonIgnore //生成json是忽略這個屬性(數(shù)據(jù)大多,全部拿到?jīng)]有意義,還有可能造成死循環(huán))
//將角色設(shè)置進來 有多個角色不能重復(fù)
private Set<Role> roles = new HashSet<>();
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatis使用annonation定義類型映射的簡易用法示例
這篇文章主要介紹了MyBatis使用annonation定義類型映射的簡易用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
Java實現(xiàn)冒泡排序與雙向冒泡排序算法的代碼示例
這篇文章主要介紹了Java實現(xiàn)冒泡排序與雙向冒泡排序算法的代碼示例,值得一提的是所謂的雙向冒泡排序并不比普通的冒泡排序效率來得高,注意相應(yīng)的時間復(fù)雜度,需要的朋友可以參考下2016-04-04
Java數(shù)據(jù)結(jié)構(gòu)之順序表詳解
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之順序表詳解,線性表在邏輯上是線性結(jié)構(gòu),也就說是連續(xù)的一條直線。但是在物理結(jié)構(gòu)上并不一定是連續(xù)的,線性表在物理上存儲時,通常以數(shù)組和鏈式結(jié)構(gòu)的形式存儲,需要的朋友可以參考下2023-07-07
SpringMVC中轉(zhuǎn)發(fā)與重定向的區(qū)別淺析
這篇文章主要給大家介紹了關(guān)于SpringMVC中轉(zhuǎn)發(fā)與重定向的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
Java用BigDecimal類解決Double類型精度丟失的問題
這篇文章主要介紹了Java用BigDecimal類解決Double類型精度丟失的問題,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-12-12

