Spring Boot JPA StackOverflowError

问题描述 投票:0回答:1

我是春季靴子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,并从春天正确得到JSON响应?有人能指出我正确的方向吗?

我发现了这个解决方法:

Infinite Recursion with Jackson JSON and Hibernate JPA issue

使用@JsonManagedReference和@JsonBackReference我可以告诉杰克逊不要在我的协会上序列化一方并且它有效!但最终的结果是单向关联(我可以看到员工实体上的电话列表,但不是每个电话实例上的员工)。那么双向关联的目的是什么,如果我必须削减它们的一面以使我的代码工作?非常困惑 :)

java jpa spring-boot associations
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.