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

 

posted @ 2020-12-29 19:35  一万年以前  阅读(1189)  评论(0编辑  收藏  举报