gpt4 book ai didi

java - 从 OneToMany 集合中删除时出现 EntityNotFoundException

转载 作者:行者123 更新时间:2023-12-01 08:00:53 24 4
gpt4 key购买 nike

我有两个通过双向 OneToMany/ManyToOne 关系连接的实体。

@Entity
class One {
@OneToMany(mappedBy = "one", orphanRemoval = true, fetch = FetchType.EAGER)
private Set<Many> manies;

// ...
}

@Entity
class Many {
@ManyToOne
@JoinColumn(name = "one_id", nullable = false)
private One one;

// ...
}

当我想要删除 Many 实例时,我将其从其 Onemanies Set 中删除并将其从数据库中删除。如果我采用相同的 One 实例并再次保存它(因为我更改了任何内容,它不一定与关系相关),我会得到一个异常:

javax.persistence.EntityNotFoundException: Unable to find test.Many with id 12345

ID(在此示例中为 12345)是刚刚删除的实体的 ID。请注意,实体 12345 的删除已成功:事务提交成功,并且该行已从数据库中删除。

添加和删除实例是通过 Spring Data 存储库完成的。删除看起来或多或少像这样:

one.getManies().remove(manyToRemove);
oneDao.save(one);
manyDao.delete(manyToRemove);

我调试了一下,发现Set是一个Hibernate PersistentSet,其中包含一个字段storedSnapshot。这又是另一个仍引用已删除实体的Set。我不知道为什么这个引用没有从快照中删除,但我怀疑这就是问题所在:我认为 Hibernate 尝试再次删除该实体,因为它位于快照中,但不在实际集合中。我搜索了很长一段时间,但没有遇到其他人有类似的问题。

我使用 Hibernate 4.2.2 和 Spring Data 1.6.0。

我做的事情本质上是错误的吗?我该如何解决这个问题?

最佳答案

我也遇到同样的问题

解决方法是替换整个集合。

Set<Many> maniesBkp = one.getManies(); // Instance of PersistentSet
maniesBkp.remove(manyToRemove);

Set<Many> manies = new HashSet<Many>();
manies.addAll(maniesBkp);

one.setManies(manies);

...
manyDao.delete(manyToRemove);
...
oneDao.save(one);

关于java - 从 OneToMany 集合中删除时出现 EntityNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25286999/

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