最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

初學(xué)使用spring data jpa,將問(wèn)題記錄

以User 和Role為例,兩者為雙向的多對(duì)多關(guān)系,即可以通過(guò)User查詢到Role信息,也可以通過(guò)Role查詢到User信息

首先要明白為什么會(huì)出現(xiàn)死循環(huán)這個(gè)問(wèn)題,造成這個(gè)死循環(huán)的原因是因?yàn)椴樵僓ser時(shí),包含了Role屬性,Role中又需要查詢除user屬性,這個(gè)不是spring data jpa 的問(wèn)題,而是只要代碼里互相關(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é)者可能對(duì)@ManyToMany這個(gè)注解存在一些疑惑,下面給出我的理解僅供參考

@ManyToMany代表多對(duì)多的關(guān)聯(lián)關(guān)系

cascade 屬性

  • CascadeType.ALL:級(jí)聯(lián)包含所有持久化方法
  • CascadeType.PERSIST只有A類新增時(shí),會(huì)級(jí)聯(lián)B對(duì)象新增。若B對(duì)象在數(shù)據(jù)庫(kù)存(跟新)在則拋異常(讓B變?yōu)槌志脩B(tài))
  • CascadeType.MERGE指A類新增或者變化,會(huì)級(jí)聯(lián)B對(duì)象(新增或者變化)
  • CascadeType.REMOVE只有A類刪除時(shí),會(huì)級(jí)聯(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ò)單向關(guān)聯(lián)時(shí)不能通過(guò)Role查詢到User的信息

單向多對(duì)多@ManyToMany的使用和理解

  • 單向多對(duì)多:就是一個(gè)實(shí)體類可以獲取到另外一個(gè)實(shí)體類
  • 多對(duì)多:一個(gè)員工可以擁有多個(gè)角色,一個(gè)角色可以對(duì)應(yīng)多個(gè)員工
    //角色單向多對(duì)多:配置中間表
    //多對(duì)多:一個(gè)員工可以擁有多個(gè)角色,一個(gè)角色可以對(duì)應(yīng)多個(gè)員工
    @ManyToMany(fetch = FetchType.LAZY)//配置懶加載
    //JoinTable是中間表表名,joinColumns指定中間表中關(guān)聯(lián)自己ID的字段,  joinColumn是列名,inverseJoinColumns表示中間表中關(guān)聯(lián)對(duì)方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)來(lái) 有多個(gè)角色不能重復(fù)
    private Set<Role> roles = new HashSet<>();

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

相關(guān)文章

  • MyBatis使用annonation定義類型映射的簡(jiǎn)易用法示例

    MyBatis使用annonation定義類型映射的簡(jiǎn)易用法示例

    這篇文章主要介紹了MyBatis使用annonation定義類型映射的簡(jiǎn)易用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Java實(shí)現(xiàn)冒泡排序與雙向冒泡排序算法的代碼示例

    Java實(shí)現(xiàn)冒泡排序與雙向冒泡排序算法的代碼示例

    這篇文章主要介紹了Java實(shí)現(xiàn)冒泡排序與雙向冒泡排序算法的代碼示例,值得一提的是所謂的雙向冒泡排序并不比普通的冒泡排序效率來(lái)得高,注意相應(yīng)的時(shí)間復(fù)雜度,需要的朋友可以參考下
    2016-04-04
  • springboot集成mqtt的實(shí)踐開發(fā)

    springboot集成mqtt的實(shí)踐開發(fā)

    本篇文章主要介紹了springboot集成mqtt的實(shí)踐開發(fā),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • mybatis-plus更新字段為null的處理方式

    mybatis-plus更新字段為null的處理方式

    這篇文章主要介紹了mybatis-plus更新字段為null的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java數(shù)據(jù)結(jié)構(gòu)之順序表詳解

    Java數(shù)據(jù)結(jié)構(gòu)之順序表詳解

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之順序表詳解,線性表在邏輯上是線性結(jié)構(gòu),也就說(shuō)是連續(xù)的一條直線。但是在物理結(jié)構(gòu)上并不一定是連續(xù)的,線性表在物理上存儲(chǔ)時(shí),通常以數(shù)組和鏈?zhǔn)浇Y(jié)構(gòu)的形式存儲(chǔ),需要的朋友可以參考下
    2023-07-07
  • 超細(xì)講解Java調(diào)用python文件的幾種方式

    超細(xì)講解Java調(diào)用python文件的幾種方式

    有時(shí)候我們?cè)趯慾ava的時(shí)候需要調(diào)用python文件,下面這篇文章主要給大家介紹了關(guān)于Java調(diào)用python文件的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Javaweb基礎(chǔ)入門requse原理與使用

    Javaweb基礎(chǔ)入門requse原理與使用

    Request對(duì)象的作用是與客戶端交互,收集客戶端的Form、Cookies、超鏈接,或者收集服務(wù)器端的環(huán)境變量,接下來(lái)本篇將詳細(xì)講述
    2021-11-11
  • SpringMVC中轉(zhuǎn)發(fā)與重定向的區(qū)別淺析

    SpringMVC中轉(zhuǎn)發(fā)與重定向的區(qū)別淺析

    這篇文章主要給大家介紹了關(guān)于SpringMVC中轉(zhuǎn)發(fā)與重定向的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 深入了解Java File分隔符和Path分隔符的使用

    深入了解Java File分隔符和Path分隔符的使用

    不同的操作系統(tǒng)使用不同的字符作為文件和路徑分隔符。當(dāng)我們的應(yīng)用程序需要在多個(gè)平臺(tái)上運(yùn)行時(shí),我們需要正確處理這些問(wèn)題。Java幫助我們選擇一個(gè)合適的分隔符,本文就來(lái)聊聊Java中File分隔符和 Path分隔符的使用
    2022-07-07
  • Java用BigDecimal類解決Double類型精度丟失的問(wèn)題

    Java用BigDecimal類解決Double類型精度丟失的問(wèn)題

    這篇文章主要介紹了Java用BigDecimal類解決Double類型精度丟失的問(wèn)題,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12

最新評(píng)論

如皋市| 全椒县| 日喀则市| 竹北市| 资溪县| 香格里拉县| 桦甸市| 新宾| 神农架林区| 利辛县| 宁明县| 习水县| 新营市| 扎赉特旗| 北辰区| 平泉县| 瓦房店市| 长岛县| 老河口市| 庐江县| 克什克腾旗| 浏阳市| 壶关县| 深水埗区| 石林| 新宾| 托里县| 紫阳县| 和政县| 凤凰县| 柘城县| 黑龙江省| 静乐县| 黄陵县| 兴文县| 宁陵县| 红河县| 新乡县| 静乐县| 南汇区| 马山县|