溫馨提示×

溫馨提示×

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

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

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

發(fā)布時間:2021-12-06 13:49:50 來源:億速云 閱讀:220 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“如何解決使用@ManyToMany查詢數(shù)據(jù)時的死循環(huán)問題”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何解決使用@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<>();

    到此,相信大家對“如何解決使用@ManyToMany查詢數(shù)據(jù)時的死循環(huán)問題”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

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

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

    AI