zoukankan      html  css  js  c++  java
  • springboot @OneToOne 解决JPA双向死循环/返回json数据死循环

    项目场景:

    在使用spring data jpa时,会用到@ManyToMany @ManyToOne @OneToMany @OneToOne,此时会有部分场景2个实体是平行的,如丈夫和妻子。


    问题描述:

    丈夫实体拥用妻子的实例,同样妻子也有丈夫的实例,那么层级就会一层层的往下循环,返回的json数据中就变成了嵌套死循环了。或者双向依赖死循环。

    那么如何进行解决返回的json数据不会死循环?下面是示例代码

    实体说明

    @Entity
    public class Husband{
    	@OneToOne(cascade = CascadeType.ALL)
    	@JoinColumn(name = "wife_id", referencedColumnName = "id")
    	private Wife wife;
    }
    
    @Entity
    public class Wife{
    	@OneToOne(mappedBy = "wife")
    	private Husband husband;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    解决方案:

    1. 转成DTO时并设置缺省

    通常实体会有对应的DTO以对外或者前端进行展示数据,如果双向依赖的husband或者是wife是不会使用到的,在DTO建立时把可以把这个属性去掉

    2. 使用@JsonIgnore

    此方法与上述的同理,在husbandwife加上注解@JsonIgnore,则返回的数据中就不会包括此项属性,不会产生双向依赖的循环嵌套问题。

    3. 使用@JsonIgnoreProperties(推荐)

    此方案更合适,即可以看到关联到妻子/丈夫的实例,也不会产生死循环问题。如下代码

    @Entity
    public class Husband{
    	@OneToOne(cascade = CascadeType.ALL)
    	@JoinColumn(name = "wife_id", referencedColumnName = "id")
    	@JsonIgnoreProperties({"husband"})
    	private Wife wife;
    }
    
    @Entity
    public class Wife{
    	@OneToOne(mappedBy = "wife")
    	@JsonIgnoreProperties({"wife"})
    	private Husband husband;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    @JsonIgnoreProperties({"husband"})
    表示返回到前台的数据中,在wife实例中的husband属性不显示

    反之
    @JsonIgnoreProperties({"wife"})
    表示返回到前台的数据中,在husband实例中的wife属性不显示

    这样就解决问题了。
    同样适应于其他双向依赖关联的实体注解,@ManyToMany @ManyToOne @OneToMany

    原文地址:https://blog.csdn.net/aa390481978/article/details/107992909

  • 相关阅读:
    专职DBA-MySQL体系结构与基本管理
    JSON
    MIME类型
    文件上传下载
    response常用的方法
    2020.11.27小记
    HTTP请求状态码
    1561. Maximum Number of Coins You Can Get
    1558. Minimum Numbers of Function Calls to Make Target Array
    1557. Minimum Number of Vertices to Reach All Nodes
  • 原文地址:https://www.cnblogs.com/nsw2018/p/14208367.html
Copyright © 2011-2022 走看看