java - REST API - 嵌套对象

标签 java spring hibernate rest

我即将设计我的 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/

相关文章:

java - 在弹出元素时将堆栈打印到控制台会不确定地抛出异常

java - Java 扫描器错误

java - 同一个类上注解Entity和Component是不是错了

java - SpringMVC、c3p0、hibernate、JPA 应用程序泄漏连接导致 Too Many Connections 错误

java - hibernate 异常 : table is not mapped

java - 检查 Java 中名称服务器的 dns 查找

java - 在 Java 中处理对象数据

java - hibernate 多对一急切获取不起作用

java - Tomcat 和 Spring MVC 中的缓存

java - hibernate native 查询错误 : Column not found