REST API - 嵌套对象

时间:2016-02-22 14:19:39

标签: java spring hibernate rest

我即将设计我的其余API。我想知道如何处理下面的对象:

@Entity
public class Foo {
@ManyToMany
private Set<Bar> barSet;
@OneToMany
private Set<Zzz> zzzSet;
}

正如您所见,我希望公开给我的对象API包含其他实体集合。我正在使用Spring 4和Jackson。是否可以返回上面的对象 - 或者我是否只需要创建具有原始值的类?

1 个答案:

答案 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注释@OneToManyfetch = 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的序列化调用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;
}