gpt4 book ai didi

java - Hibernate 集合保留对已删除实体的引用

转载 作者:行者123 更新时间:2023-12-02 13:42:09 28 4
gpt4 key购买 nike

我们使用 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;
}

现在我尝试以下操作:创建一个新的 E1 并使用 spring JPA 存储库保存,无需显式 spring 事务。

E1 detachedE1 = e1Repo.save(e1);

e1 具有 e2 的非空集合。

我从 e1 中删除 e2 实体,然后将 e1 保存在 Spring 事务中。

然后,我尝试按如下方式使用detachedE1:

   detachedE1.setE2Collection(Collections.emptyList())
e1Repo.save(detachedE1)

上面的代码出错了,错误基本上是这样的:

springframework.orm.jpa.JpaObjectRetrievalFailureException:无法找到 ID 为 1.00 的实体.E2

我的问题是,JPA 如何保留对已删除集合的引用。我将 E2 集合设置为空列表。我还验证了 e1Repo.find(detachedE1.e1_id) 返回的实体有一个空集合。

提前感谢您的任何回复/指点!

只是想添加我们使用 hibernate hibernate-entitymanager-4.3.8.Final.jar

最佳答案

所以在使用调试器挖掘 hibernate 代码后我终于弄清楚了这一点。分离实体的集合实际上是一个 PersistentBag,这应该不会太令人惊讶。但是持久包维护了一个快照,当我将集合设置为空列表时,该快照不会被清除。

只是为了测试我的最终理论,我添加了以下内容:

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

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

关于java - Hibernate 集合保留对已删除实体的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42682910/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com