我即将设计我的 REST API。我想知道如何处理如下对象:
@Entity
public class Foo {
@ManyToMany
private Set<Bar> barSet;
@OneToMany
private Set<Zzz> zzzSet;
}
如您所见,我想要向其余 API 公开的对象由其他实体集合组成。我正在使用 Spring 4 和 Jackson。是否可以返回像上面这样的对象 - 或者我是否必须创建仅具有原始值的类?
最佳答案
是的,这是可能的,但你必须处理两个问题:
1) 在序列化时,Jackson 将调用 getter Foo.getBarSet()
。这会崩溃,因为默认情况下,Hibernate 返回 @OneToMany
和 @ManyToMany
关系的惰性集合。
如果不需要它们,请使用 @JsonIgnore
进行注释:
@Entity
public class Foo {
@JsonIgnore
@ManyToMany
private Set<Bar> barSet;
@JsonIgnore
@OneToMany
private Set<Zzz> zzzSet;
}
如果你需要它们,你必须告诉hibernate加载它们。例如,您可以使用 fetch = FetchType.EAGER
注释 @ManyToMany
和 @OneToMany
(这不是唯一的解决方案):
@Entity
public class Foo {
@ManyToMany(fetch = FetchType.EAGER)
private Set<Bar> barSet;
@OneToMany(fetch = FetchType.EAGER)
private Set<Zzz> zzzSet;
}
2) 它还可能导致一些无限循环:
- Foo 调用的序列化
Foo.getBarSet()
- Bar 调用的序列化
Bar.getFoo()
- Foo 调用的序列化
Foo.getBarSet()
- [...]
这可以通过 @JsonManagedReference
和 @JsonBackReference
来处理:
@Entity
public class Foo {
@JsonManagedReference
@OneToMany
private Set<Zzz> zzzSet;
另一边:
@Entity
public class Zzz {
@JsonBackReference
private Foo parent;
}
关于java - REST API - 嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35555981/