有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    因此,在使用调试器深入研究hibernate代码之后,我终于找到了答案。分离实体的集合实际上是一个PersistentBag,这不应该太令人惊讶。 但是持久性包维护一个快照,当我将集合设置为空列表时,快照不会被清除

    为了验证我的最终理论,我添加了以下内容:

    ((PersistentCollection)e1.getE2Collection()).setSnapshot(null, null, null);
    

    在此之后,hibernate持久上下文能够成功地合并分离的实体,E2集合设置为空列表