3 回答
TA贡献1824条经验 获得超5个赞
为避免循环引用无限递归(stackoverflow 错误),您必须使用 @JsonIdentityInfo 注释cals
所以你的课看起来像:
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id")
class A {
//some fields
//Integer id;
@OneToMany private B b; //if only A is requested, this should NOT be ignored
}
B类双向使用也是如此:
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id")
class B {
//some fields
@ManyToOne
@IgnorePrivateBInAToAvoidStackOverflow
private Set<A> collectionOfAs;
}
请注意,property指的是您的唯一字段名称(id 在此示例中设置为)
TA贡献1844条经验 获得超8个赞
您对@ManyToOne&的使用@OneToMany不正确,您必须在实体集合属性上的实体@OneToMany内使用,反之亦然OneMany@ManyToOne
class A {
@ManyToOne
@JsonBackReference
private B b;
}
class B {
@OneToMany
@JsonManagedReference
private Set<A> collectionOfAs;
}
并且据我所知,您想忽略所有者B从 class 进行反向引用A,并创建一个 stackoverflow 异常,以使用我在上面的示例中添加的注释来实现这一点,@JsonBackReference这@JsonManagedReference将停止无限在它的轨道上循环。
TA贡献1811条经验 获得超6个赞
如果 B 类有一个 A 类的集合,那么 B 类中的 A 的集合应该被注释@OneToMany,并且 A 类中的字段应该被注释@ManyToOne,那么你可以@JsonIgnore像这样把你放在集合上:
class A {
//some fields
@ManyToOne private B b; //if only A is requested, this should NOT be ignored
}
class B {
//some fields
@OneToMany
@JsonIgnore
private Set<A> collectionOfAs;
}
我的猜测是您收到 StackOverflow 错误,因为当您获取 B 类的某个对象时,它带来了 As 类的对象集,它们本身带来了最初获取的 B 类的相同对象,这将去无限,除非您在 Set 字段上提供 @JsonIgnore。这样,当你调用 A 类的对象时,它们 B 类的字段对象也会被获取,但是当你调用 B 类的对象时,它们的 As 类集合将被忽略。
添加回答
举报