2017-10-12 60 views
2

我正在使用spring數據jpa來構建我的項目。有一個用戶實體和一個商務實體。Jpa實體關係造成無限循環

@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL) 
@JoinColumn(name = "user_id") 
private UserInformation belongUser;//所屬用戶 

以上代碼是Biz類的一部分。

@OneToMany(cascade = CascadeType.ALL,mappedBy = "belongUser") 
private Set<BizInformation> bizs = new HashSet<BizInformation>(); 

這是用戶類的一部分

的問題是,當我通過基於REST的API一個UserInfomation,它返回一個商業信息,那麼商業信息裏面返回UserInfomation,並最終導致出現StackOverflow異常。

我該如何解決這個問題?謝謝。

+0

無限循環的地方,但你不說。看起來這是JSON,這是絕對無關的JPA API – DN1

+0

@ DN1這是衆所周知的JSON串行器行爲(很多人說:錯誤,其他:功能) –

回答

2

此問題是由雙向關係引起的。您可以使用 @JsonManagedReference@JsonBackReference

  • @JsonManagedReference是參考前一部分 - 通常被序列化的一個。
  • @JsonBackReference是引用的後面部分 - 它將從序列化中省略 。
你的情況

您可以在用戶類添加@JsonManagedReference

@OneToMany(cascade = CascadeType.ALL,mappedBy = "belongUser") 
@JsonManagedReference 
private Set<BizInformation> bizs = new HashSet<BizInformation>(); 

和@JsonBackReference爲商務類將省略UserInformation系列化

@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL) 
@JoinColumn(name = "user_id") 
@JsonBackReference 
private UserInformation belongUser;//所屬用戶 

你也可以使用@JsonIgnore爲您想要省略序列化的類

更多詳細信息:jackson-bidirectional-relationships-and-infinite-recursion

+0

不錯的問題和更好的答案 – Acewin

+1

這是一個非常常見的情況。試圖將實體組織到json中的人通常會忘記循環。 – Acewin

+1

非常好的答案,完美的作品,感謝您的幫助 – zpwpal

1

另一種方法是使用@JsonIgnoreProperties

@JsonIgnoreProperties("bizs") 
@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL) 
@JoinColumn(name = "user_id") 
private UserInformation belongUser;