我是春季靴子JPA的新人。我正在尝试这里描述的例子:
所以我定义了两个实体:
@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我可以告诉杰克逊不要在我的协会上序列化一方并且它有效!但最终的结果是单向关联(我可以看到员工实体上的电话列表,但不是每个电话实例上的员工)。那么双向关联的目的是什么,如果我必须削减它们的一面以使我的代码工作?非常困惑 :)
我相信Hibernate可以很好地管理这种双向关联。只有当Jackson尝试从您的对象结构构建JSON时,它才会进入递归状态。