我想知道如何使用具有雙向關係的Spring REST處理序列化。我目前正在使用Spring Boot 1.3.0.BUILD-SNAPSHOT嵌套對象上的無限遞歸Spring REST
目前,我收到併發出內部服務器錯誤,指出主類存儲庫上的GET請求有無限遞歸。
它適用於兩個類,其中之一是一個存儲庫。在本例中A爲具有存儲庫中的一個:
@Entity
public class A implements Serializable {
private static final long serialVersionUID = 1L;
@OneToMany(mappedBy = "a", cascade = CascadeType.ALL)
@JsonManagedReference
private List<B> b;
public A() {
}
public List<B> getB() {
return b;
}
public void setCategory(List<B> b) {
this.b = b;
for (B oneB : this.category) {
oneB.setA(this);
}
}
}
@Entity
public class B implements Serializable {
private static final long serialVersionUID = 1L;
@ManyToOne
@JoinColumn(name = "b_column")
@JsonBackReference
@RestResource(rel = "BParent")
private A a;
public B() {
}
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
}
但是,如果我添加了另一類是B的裏面就不管用了,我會得到無限遞歸,如果我發送一個GET請求到A的存儲庫(C有其b屬性相同的註解b):
@Entity
public class B implements Serializable {
private static final long serialVersionUID = 1L;
@ManyToOne
@JoinColumn(name = "b_column")
@JsonBackReference
@RestResource(rel = "BParent")
private A a;
@OneToMany(mappedBy = "c", cascade = CascadeType.ALL)
@JsonManagedReference
private List<C> c;
public B() {
}
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
}
從我的觀察,我可以省略C類傑克遜註釋的反向引用沒有得到任何行爲改變到b
所以。這是已知的行爲還是我錯過了什麼?
更新1
我試圖通過修改B級擺脫B和C對象之間的雙向關係,並刪除C上的後向引用:
@Entity
public class B implements Serializable {
private static final long serialVersionUID = 1L;
@ManyToOne
@JoinColumn(name = "b_column")
@JsonBackReference
@RestResource(rel = "BParent")
private A a;
//This is now a unidirectional relationship to C
@NotNull
@OneToMany
@JoinColumn(name="b_id", referencedColumnName="id")
private List<C> c;
public B() {
}
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
public List<C> getC() {
return c;
}
public void setC(List<C> c) {
this.c= c;
}
}
這枚出手無限遞歸在A的倉庫(Hooray!)上的GET請求時,它也消除了在發送POST到A倉庫(boooh!)時存儲C對象的可能性。這將拋出此錯誤消息:
org.hibernate.TransientObjectException:對象引用一個未保存的瞬態的實例 - 沖洗
更新2
之前保存的瞬態的實例我試圖添加存儲庫爲B類。這導致了另一個無限遞歸。但是這次應用程序和IDE只是因爲錯誤處理不當而崩潰。