springboot @OneToOne 解决JPA双向死循环/返回json数据死循环

springboot @OneToOne 解决JPA双向死循环/返回json数据死循环

  • 项目场景:
  • 问题描述:
  • 解决方案:
    • 1. 转成DTO时并设置缺省
    • 2. 使用@JsonIgnore
    • 3. 使用@JsonIgnoreProperties(推荐)

项目场景:

在使用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. 转成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;
}

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

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

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

你可能感兴趣的:(前端快速入门Spring)