解決使用@ManyToMany查詢數(shù)據(jù)時(shí)的死循環(huán)問題
使用@ManyToMany查詢數(shù)據(jù)時(shí)的死循環(huán)
初學(xué)使用spring data jpa,將問題記錄
以User 和Role為例,兩者為雙向的多對多關(guān)系,即可以通過User查詢到Role信息,也可以通過Role查詢到User信息
首先要明白為什么會(huì)出現(xiàn)死循環(huán)這個(gè)問題,造成這個(gè)死循環(huán)的原因是因?yàn)椴樵僓ser時(shí),包含了Role屬性,Role中又需要查詢除user屬性,這個(gè)不是spring data jpa 的問題,而是只要代碼里互相關(guān)聯(lián)都會(huì)造成這種情況,解決這種情況的方法我大概研究出了兩種
一、在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; }
很多初學(xué)者可能對@ManyToMany這個(gè)注解存在一些疑惑,下面給出我的理解僅供參考
@ManyToMany代表多對多的關(guān)聯(lián)關(guān)系
cascade 屬性
CascadeType.ALL
:級聯(lián)包含所有持久化方法CascadeType.PERSIST
只有A類新增時(shí),會(huì)級聯(lián)B對象新增。若B對象在數(shù)據(jù)庫存(跟新)在則拋異常(讓B變?yōu)槌志脩B(tài))CascadeType.MERGE
指A類新增或者變化,會(huì)級聯(lián)B對象(新增或者變化)CascadeType.REMOVE
只有A類刪除時(shí),會(huì)級聯(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)時(shí)不能通過Role查詢到User的信息
單向多對多@ManyToMany的使用和理解
- 單向多對多:就是一個(gè)實(shí)體類可以獲取到另外一個(gè)實(shí)體類
- 多對多:一個(gè)員工可以擁有多個(gè)角色,一個(gè)角色可以對應(yīng)多個(gè)員工
//角色單向多對多:配置中間表 //多對多:一個(gè)員工可以擁有多個(gè)角色,一個(gè)角色可以對應(yīng)多個(gè)員工 @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是忽略這個(gè)屬性(數(shù)據(jù)大多,全部拿到?jīng)]有意義,還有可能造成死循環(huán)) //將角色設(shè)置進(jìn)來 有多個(gè)角色不能重復(fù) private Set<Role> roles = new HashSet<>();
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中HashMap和Hashtable及HashSet的區(qū)別
以下是對Java中HashMap和Hashtable及HashSet的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-09-09SpringMVC中的DispatcherServlet結(jié)構(gòu)和初始化詳解
這篇文章主要介紹了SpringMVC中的DispatcherServlet結(jié)構(gòu)和初始化詳解,SpringMVC中Spring容器的關(guān)系是通過監(jiān)聽方式啟動(dòng)的,那么Spring與Servlet的Web容器(如:Tomcat、jetty)的關(guān)系則是通過DispatcherServlet進(jìn)行關(guān)聯(lián),需要的朋友可以參考下2024-01-01Spring框架構(gòu)造注入type屬性實(shí)例詳解
這篇文章主要介紹了Spring框架構(gòu)造注入type屬性實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Spring?Boot項(xiàng)目抵御XSS攻擊實(shí)戰(zhàn)過程
XSS攻擊又稱跨站腳本攻擊,通常指利用網(wǎng)頁開發(fā)時(shí)留下的漏洞,通過巧妙的方法注入惡意指令代碼到網(wǎng)頁,使用戶加載并執(zhí)行攻擊者惡意制造的網(wǎng)頁程序,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot項(xiàng)目抵御XSS攻擊的相關(guān)資料,需要的朋友可以參考下2022-11-11mybatis-plus使用generator實(shí)現(xiàn)逆向工程
mybatis-plus-generator在3.5.0以及以后的版本使用新的方式逆向生成代碼,本文主要介紹了mybatis-plus使用generator實(shí)現(xiàn)逆向工程,具有一定的參考價(jià)值,感興趣的可以了解一下2022-05-05redis實(shí)現(xiàn)多進(jìn)程數(shù)據(jù)同步工具代碼分享
這篇文章主要介紹了使用redis實(shí)現(xiàn)多進(jìn)程數(shù)據(jù)同步工具的代碼,大家參考使用吧2014-01-01使用Spring從YAML文件讀取內(nèi)容映射為Map方式
這篇文章主要介紹了使用Spring從YAML文件讀取內(nèi)容映射為Map方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02