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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM