springboot @OneToOne 解決JPA雙向死迴圈/返回json資料死迴圈
阿新 • • 發佈:2020-12-29
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