springboot @OneToOne 解决JPA双向死循环/返回json数据死循环
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
此方法与上述的同理,在husband
和wife
加上注解@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