我即将设计我的其余API。我想知道如何处理下面的对象:
@Entity
public class Foo {
@ManyToMany
private Set<Bar> barSet;
@OneToMany
private Set<Zzz> zzzSet;
}
正如您所见,我希望公开给我的对象API包含其他实体集合。我正在使用Spring 4和Jackson。是否可以返回上面的对象 - 或者我是否只需要创建具有原始值的类?
答案 0 :(得分:3)
是的,这是可能的,但你必须处理2个问题:
1)在序列化时,杰克逊将召唤吸气者Foo.getBarSet()
。这会崩溃,因为默认情况下,Hibernate会返回@OneToMany
和@ManyToMany
关系的惰性集合。
如果您不需要,请使用@JsonIgnore
:
@Entity
public class Foo {
@JsonIgnore
@ManyToMany
private Set<Bar> barSet;
@JsonIgnore
@OneToMany
private Set<Zzz> zzzSet;
}
如果你需要它们,你必须告诉hibernate加载它们。例如,您可以使用@ManyToMany
注释@OneToMany
和fetch = FetchType.EAGER
(这不是btw的唯一解决方案):
@Entity
public class Foo {
@ManyToMany(fetch = FetchType.EAGER)
private Set<Bar> barSet;
@OneToMany(fetch = FetchType.EAGER)
private Set<Zzz> zzzSet;
}
2)它也会导致一些无限循环:
Foo.getBarSet()
Bar.getFoo()
Foo.getBarSet()
可以使用@JsonManagedReference
和@JsonBackReference
:
@Entity
public class Foo {
@JsonManagedReference
@OneToMany
private Set<Zzz> zzzSet;
另一方面:
@Entity
public class Zzz {
@JsonBackReference
private Foo parent;
}