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