Spring Boot JPA ***Error

Posted

技术标签:

【中文标题】Spring Boot JPA ***Error【英文标题】: 【发布时间】: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 ***Error。实际上我正在尝试引用员工,其中包括电话列表,但是电话引用了员工,所以它不是递归吗?我觉得我缺少一些关于双向关联的东西(单向关联工作得很好).. 我怎样才能有一个实体 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 请将此添加为答案。谢谢 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于Spring Boot JPA ***Error的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例

[Spring Boot] Adding JPA and Spring Data JPA

spring-data-jpa 和 spring-boot-starter-data-jpa 的区别

spring boot jpa

Spring Boot 整合Spring Data JPA

Spring Boot中使用Spring Data JPA示例