|
|
1
7
在Hibernate中,我通常使用两种方法更新集合(一对多集合的多个方面)。蛮力方法是清除集合,在父级上调用save,然后调用flush。然后重新添加所有集合成员,并再次调用父集合上的save。这将删除全部,然后插入全部。中间的刷新是关键,因为它迫使删除发生在插入之前。最好只在小集合上使用此方法,因为它会重新插入所有集合。 第二种方法更难编码,但效率更高。您循环遍历新的子项集,手动修改仍然存在的子项,删除不存在的子项,然后添加新的子项。在伪代码中,将是:
我在Hibernate论坛上搜索了好几个小时,试图找到解决这个问题的正确方法。您应该能够只更新集合以使其准确,然后保存父集合,但正如您所发现的,Hibernate会在删除子集合之前尝试将其与父集合分离,如果外键不为null,则将失败。 |
|
|
2
5
看到问题的答案了吗 Overriding equals and hashCode in Java '. 它解释了如何重写equals和hashCode方法,这似乎是您的问题,因为它在重写它们之后仍然有效。 错误地覆盖它们可能会导致hibernate删除您的集合并重新插入它们。(因为散列键在映射中用作键) |
|
3
3
我不确定这是否是解决方案,但您可能希望尝试:
并且没有@JoinColumn注释?我认为这两个实体都在试图“拥有”关联,这就是为什么SQL可能会出错的原因? 此外,如果要确保仅更新受影响的列,可以在类上使用特定于hibernate的注释:
|
|
|
4
0
Brian Detering的回答帮助我克服了幻影删除。我希望他写了一个真正的密码。以下是我从他的建议中得到的信息。张贴供某人使用或评论我的代码。
|
|
|
Gero Mendy · 如何为一个类分配兵变的结果。查询 2 年前 |
|
Hamvy B · 替换不推荐的hibernate方法 2 年前 |
|
Martin Pfeffer · Spring Boot JPA 2 年前 |
|
|
denstran · 休眠未生成正确的id 2 年前 |
|
|
Frank · 忽略/跳过Hibernate架构验证中的特定字段 2 年前 |