当前位置: 首页 > 知识库问答 >
问题:

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

华宪
2023-03-14

我有一种关系:

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

Child {
    @ManyToOne
    private Parent parent;
}

我要删除所有子级并添加新的子级。所以我才叫:

List<Child> newChildren = Arrays.asList(firstChild, secondChild);
parent.getChildren().clear();
parent.getChildren().addAll(newChildren);
parentRepository.save(parent); - I'm using spring data

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

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

save替换为saveandflush将修复上面的代码,并导致父级只有2个子级。

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

共有1个答案

仲孙鸿飞
2023-03-14

crudrepository#savejavadoc:

%S保存(%S实体)

保存给定的实体。使用返回的实例进行进一步的操作,因为保存操作可能已经完全更改了实体实例。

所以我相信当你替换为:

parent = parentRepository.save(parent);
 类似资料:
  • 问题内容: 我正在尝试实现一个简单的DAO。我有道: 和一个实体: 这是appContext.xml: 除非我在之后调用或插入未执行。这是为什么?如果删除,则刷新时会出现“没有正在进行的事务”的错误,但是如果删除刷新,则不会插入到数据库中。 问题答案: 之所以这样工作是因为您使用标记了事务为只读。 如您所见,由于您仍然可以通过手动调用保留更改,因此它不会使您的事务实际上是只读的。但是,它在事务结束

  • 问题内容: 我与CohortGroup和Employee有很多关系。每当我将Employee插入CohortGroup时,hibernate都会从解析表中删除该组,然后再次插入所有成员以及新成员。为什么不只是添加新的呢? 组中的注释: 员工的另一边 代码嗅探 下面是日志中报告的SQL 这种接缝的效率很低,并且会引起一些问题。如果有人提出要求将雇员添加到组中,则有些人将其改写。 诸如equals和h

  • 本文向大家介绍js中数组插入、删除元素操作的方法,包括了js中数组插入、删除元素操作的方法的使用技巧和注意事项,需要的朋友参考一下 实例如下: 通过上面的函数,可以处理上移和下移的动作 定义和用法 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。 注释:该方法会改变原始数组。 语法 参数 描述 index 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置

  • 问题内容: 我实际上从未完全了解hibernate状态下的这种行为。我在名为“ Parent”的实体中使用@OneToMany关系,其注释如下: 现在,我想在一个事务中执行以下操作: 获取父实体 遍历孩子们的名单 删除其中一个孩子 插入一个新孩子 因此,基本上我只是完全替换其中一个孩子。 据我了解的这个问题,我应该能够做这样的事情:(请注意,这只是一些Java伪代码来说明问题) 但是,如果新的Ch

  • 现在我想在一个事务内执行以下操作: 获取父实体 遍历子级列表 删除其中一个子项 插入新子级 所以,基本上我只是完全替换了其中一个孩子。 由于我不想让hibernate混淆了发送到DB的语句的顺序,所以我对hibernate肯定有其他的假设,但情况并非如此。你知道为什么后一个例子有效,而第一个却不行吗? Hibernate版本为3.5。是Mysql InnoDB

  • 请注意,在转向您之前,我已经浏览了各种帖子。事实上,我尝试实现中提供的解决方案:基于“notin”条件从数据帧中删除行 我的问题如下。让我们假设我有一个巨大的数据帧,我想删除重复的数据帧。我很清楚我可以使用drop_duplicates,因为这是最快的最简单的方法。然而,我们的老师希望我们创建一个包含重复项ID的列表,然后根据这些值是否包含在上述列表中删除它们。 现在,让我们看看输出: 因此,我得