亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

解決使用@ManyToMany查詢數(shù)據(jù)時的死循環(huán)問題

 更新時間:2021年12月06日 11:30:31   作者:木子人弋山  
這篇文章主要介紹了解決使用@ManyToMany查詢數(shù)據(jù)時的死循環(huán)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

使用@ManyToMany查詢數(shù)據(jù)時的死循環(huán)

初學(xué)使用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; 
}

很多初學(xué)者可能對@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è)置進(jìn)來 有多個角色不能重復(fù)
    private Set<Role> roles = new HashSet<>();

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中HashMap和Hashtable及HashSet的區(qū)別

    Java中HashMap和Hashtable及HashSet的區(qū)別

    以下是對Java中HashMap和Hashtable及HashSet的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • Java 泛型總結(jié)(三):通配符的使用

    Java 泛型總結(jié)(三):通配符的使用

    在泛型的使用中,還有個重要的東西叫通配符,本文介紹通配符的使用。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • SpringMVC中的DispatcherServlet結(jié)構(gòu)和初始化詳解

    SpringMVC中的DispatcherServlet結(jié)構(gòu)和初始化詳解

    這篇文章主要介紹了SpringMVC中的DispatcherServlet結(jié)構(gòu)和初始化詳解,SpringMVC中Spring容器的關(guān)系是通過監(jiān)聽方式啟動的,那么Spring與Servlet的Web容器(如:Tomcat、jetty)的關(guān)系則是通過DispatcherServlet進(jìn)行關(guān)聯(lián),需要的朋友可以參考下
    2024-01-01
  • Spring框架構(gòu)造注入type屬性實例詳解

    Spring框架構(gòu)造注入type屬性實例詳解

    這篇文章主要介紹了Spring框架構(gòu)造注入type屬性實例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Java8 新特性之日期時間對象及一些其他特性

    Java8 新特性之日期時間對象及一些其他特性

    這篇文章主要介紹了Java8 新特性之日期時間對象及一些其他特性,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • Spring?Boot項目抵御XSS攻擊實戰(zhàn)過程

    Spring?Boot項目抵御XSS攻擊實戰(zhàn)過程

    XSS攻擊又稱跨站腳本攻擊,通常指利用網(wǎng)頁開發(fā)時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網(wǎng)頁,使用戶加載并執(zhí)行攻擊者惡意制造的網(wǎng)頁程序,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot項目抵御XSS攻擊的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • mybatis-plus使用generator實現(xiàn)逆向工程

    mybatis-plus使用generator實現(xiàn)逆向工程

    mybatis-plus-generator在3.5.0以及以后的版本使用新的方式逆向生成代碼,本文主要介紹了mybatis-plus使用generator實現(xiàn)逆向工程,具有一定的參考價值,感興趣的可以了解一下
    2022-05-05
  • java同步與異步的學(xué)習(xí)筆記整理

    java同步與異步的學(xué)習(xí)筆記整理

    在本篇文章里小編給大家整理了關(guān)于java同步與異步的學(xué)習(xí)筆記整理內(nèi)容,需要的朋友們參考下。
    2020-02-02
  • redis實現(xiàn)多進(jìn)程數(shù)據(jù)同步工具代碼分享

    redis實現(xiàn)多進(jìn)程數(shù)據(jù)同步工具代碼分享

    這篇文章主要介紹了使用redis實現(xiàn)多進(jìn)程數(shù)據(jù)同步工具的代碼,大家參考使用吧
    2014-01-01
  • 使用Spring從YAML文件讀取內(nèi)容映射為Map方式

    使用Spring從YAML文件讀取內(nèi)容映射為Map方式

    這篇文章主要介紹了使用Spring從YAML文件讀取內(nèi)容映射為Map方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評論