1. 程式人生 > 實用技巧 >springboot @OneToOne 解決JPA雙向死迴圈/返回json資料死迴圈

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

此方法與上述的同理,在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