我想知道如何使用具有双向关系的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只是因为错误处理不当而崩溃。