java Hibernate集合保留对已删除实体的引用
我们使用spring data hibernate作为数据库访问的ORM。我的实体设置如下:
class E1 {
@Column(name = "e1_id")
private BigDecimal e1_id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "e1", orphanRemoval=true, fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
private Collection<E2> e2List;
}
class E2 {
@Column(name = "e2_id")
private BigDecimal e2_id;
@JoinColumn(name = "e1_id", referencedColumnName = "e1_id")
@ManyToOne
private E1 e1;
}
现在我尝试以下方法: 使用spring JPA存储库创建新的E1并保存,无需显式的spring事务
E1 detachedE1 = e1Repo.save(e1);
e1有一个非空的e2集合
我从e1中删除e2实体,然后在spring事务中保存e1
然后,我尝试使用detachedE1,如下所示:
detachedE1.setE2Collection(Collections.emptyList())
e1Repo.save(detachedE1)
上面的代码出错了,错误基本上是这样的:
springframework。奥姆。jpa。JpaObjectRetrievalFailureException:找不到实体。id为1.00的E2
我的问题是,JPA如何保留对已删除收藏的引用。我将E2集合设置为空列表。我还验证了e1Repo返回的实体。find(detachedE1.e1_id)的集合为空
提前感谢您的回复/指点
只是想补充一下,我们使用hibernate-entitymanager-4.3.8。最终的罐子
# 1 楼答案
因此,在使用调试器深入研究hibernate代码之后,我终于找到了答案。分离实体的集合实际上是一个PersistentBag,这不应该太令人惊讶。 但是持久性包维护一个快照,当我将集合设置为空列表时,快照不会被清除
为了验证我的最终理论,我添加了以下内容:
在此之后,hibernate持久上下文能够成功地合并分离的实体,E2集合设置为空列表