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