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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM