Hibernate - 多次删除+插入操作而不调用flush方法会导致重复数据

5 浏览
0 Comments

Hibernate - 多次删除+插入操作而不调用flush方法会导致重复数据

我有一个关系:

Parent {
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "parent")
    private List children = new ArrayList<>();
}
Child {
    @ManyToOne
    private Parent parent;
}

我想删除所有的子项并添加新的子项。这就是为什么我调用:

List  newChildren = Arrays.asList(firstChild, secondChild);
parent.getChildren().clear();
parent.getChildren().addAll(newChildren);
parentRepository.save(parent);-我使用spring data

然而,我发现当我调用上面的代码两次时(我有更复杂的逻辑,但这是我能够复制我的问题的最简单的情况),不调用flush()方法时,Hibernate会向数据库添加重复的条目(parent将有4个子项):

parent.getChildren().clear();
parent.getChildren().addAll(newChildren);
parentRepository.save(parent);
parent.getChildren().clear();
parent.getChildren().addAll(newChildren);
parentRepository.save(parent);

save替换为saveAndFlush修复了上面的代码,并导致parent只有2个子项。

为什么在删除和插入新的子项到父项之前需要调用flush方法?

0
0 Comments

问题的原因是在进行多次删除和插入操作时,没有调用flush方法会导致重复数据。解决方法是在保存实体后,使用返回的实例进行进一步操作,因为保存操作可能会完全更改实体实例。所以解决该问题的方法是将代码中的parent变量替换为parentRepository.save(parent)。

在你的代码中,你继续对未附加到上下文的实体进行操作,从而导致重复数据。但是,这并不能解决这个问题。

0