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

  • 相关阅读:
    系统吞吐量(TPS)、用户并发量、性能测试概念和公式
    javascript 匿名函数和闭包
    构建高可扩Web架构和分布式系统实战
    Javascript prototype 的作用
    myeclipse下载地址
    tomacat7.0配置(windows)
    IEEE802.11
    C#(多态)
    C#(泛型集合的使用)
    C#(对象引用)
  • 原文地址:https://www.cnblogs.com/nsw2018/p/14208367.html
Copyright © 2011-2022 走看看