【问题标题】:Spring Boot JPA StackOverflowErrorSpring Boot JPA StackOverflowError
【发布时间】:2018-02-15 09:16:17
【问题描述】:

我是 Spring Boot JPA 的新手。我正在尝试此处描述的示例:

https://en.wikibooks.org/wiki/Java_Persistence/OneToMany#Example_of_a_OneToMany_relationship_database

所以我定义了两个实体:

@Entity
public class Employee {
  @Id
  @Column(name="EMP_ID")
  private long id;
  ...
  @OneToMany(mappedBy="owner")
  private List<Phone> phones;
  ...
}

和:

@Entity
public class Phone {
  @Id
  private long id;
  ...
  @ManyToOne(fetch=FetchType.LAZY)
  @JoinColumn(name="OWNER_ID")
  private Employee owner;
  ...
}

(一名员工可以拥有多个电话号码、工作单位、家庭等)。问题是,当我尝试使用我的 entityManager 列出 Employee 实例时:

public List<Employee> getAll() 
{
    return entityManager.createQuery("from Employee").getResultList();
}

我收到了 Spring StackOverflowError。实际上我正在尝试引用员工,其中包括电话列表,但是电话引用了员工,所以它不是递归吗?我觉得我缺少一些关于双向关联的东西(单向关联工作得很好).. 我怎样才能有一个实体 A 引用 B,B 引用 A,并从 spring 正确地得到 JSON 响应?有人可以指出我正确的方向吗?

我找到了这个解决方法:

Infinite Recursion with Jackson JSON and Hibernate JPA issue

使用@JsonManagedReference 和@JsonBackReference 我可以告诉Jackson 不要序列化我的关联的一侧并且它有效!但最终结果是单向关联(我可以看到员工实体上的电话列表,但看不到每个电话实例上的员工)。那么,如果我必须剪掉它们的一侧才能让我的代码正常工作,那么双向关联的目的是什么?很困惑:)

【问题讨论】:

  • 我相信 Hibernate 可以很好地管理这种双向关联。只有当 Jackson 尝试从您的对象结构构建 JSON 时,它才会进入递归。
  • 所以关键是从休眠的角度来看双向关联是可以的,但是我当然不能通过jackson检索诸如对象(合理)
  • 很明显,堆栈跟踪会告诉人们递归在方法调用中的位置...... JPA 或 JSON。但我们看不到它
  • 你应该可以从堆栈跟踪中看出
  • Uday 的评论是正确的:我相信 Hibernate 可以很好地管理这种双向关联。只有当杰克逊尝试从您的对象结构构建 JSON 时,它才会进入递归。 @UdayFokane 请将此添加为答案。谢谢

标签: java jpa spring-boot associations


【解决方案1】:

我相信 Hibernate 可以很好地管理这种双向关联。只有当 Jackson 尝试从您的对象结构构建 JSON 时,它才会进入递归。

【讨论】:

    【解决方案2】:

    如果您在实体中使用@Data,请尝试覆盖toString 方法。

    我也遇到过同样的问题,但是在覆盖 toString 方法后它得到了解决。 可能是toString 在转换时创建循环依赖。

    【讨论】:

      猜你喜欢
      • 2023-02-01
      • 2017-09-17
      • 2018-07-10
      • 2017-05-12
      • 2021-04-02
      • 2017-07-04
      • 2020-09-12
      • 1970-01-01
      • 2017-05-09
      相关资源
      最近更新 更多