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

试图用SpringData删除和重新插入行时出现JPA错误“无法合并已删除的实体”

柏麒
2023-03-14
@Entity
@Table(name="MY_ENTITY")
public class MyEntity implements Serializable {

    @Id 
    @Column(insertable=true, updatable=true, nullable=false)
    private String propertyid;

    \\other columns
}
    @Transactional
    public void deleteAndSave(MyEntity entity) {
        propertyInfoRepository.deleteAll();
        propertyInfoRepository.flush(); // <- having it or not, nothing changes
        propertyInfoRepository.save(entity);
    }       

但这给了我这个错误:

    Caused by: java.lang.IllegalArgumentException: Cannot merge an entity that has been removed: com.xxx.MyEntity@1f28c51
at org.eclipse.persistence.internal.sessions.MergeManager.registerObjectForMergeCloneIntoWorkingCopy(MergeManager.java:912)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfCloneIntoWorkingCopy(MergeManager.java:494)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChanges(MergeManager.java:271)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.mergeCloneWithReferences(UnitOfWorkImpl.java:3495)
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.mergeCloneWithReferences(RepeatableWriteUnitOfWork.java:378)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.mergeCloneWithReferences(UnitOfWorkImpl.java:3455)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.mergeInternal(EntityManagerImpl.java:486)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.merge(EntityManagerImpl.java:463)
....

我做错了什么?我不明白为什么它试图合并实体,而不是简单地在删除后重新插入它。

谢谢你的帮助!

共有1个答案

陶琦
2023-03-14

直接回答你的问题:

问题是,您试图保存的实体已经有了一个持久标识,即ID,这就是为什么您的存储库将尝试合并,而不是持久化该实体。

如果您看到这个问题,那么它似乎是在Spring存储库级别上触发的(至少),因此您可以考虑重写存储库的save方法,并测试问题是否仍然存在。

 类似资料:
  • 我在Spring Data JPA/EclipseLink环境中有一个实体(其主键不是由序列生成的),如下所示: 并且我正在尝试从表中删除一行并重新插入它(使用相同的主键)。 我的方法是调用deleteAll()来清理表,然后保存()新的实体: 但这给了我一个错误: 我做错了什么?我不明白为何要将该实体合并,而不是简单地将其删除后重新插入。 谢谢你的帮助!

  • 我正在尝试使用此查询删除具有重复的列值的行: 但这给了 查询看起来很好。我错过了什么?

  • 我是一个生锈的初学者,并尝试使用

  • 问题内容: 我只是对某事感到好奇。让我说我有一个表,我将更新该值,然后将其删除,然后插入新的1。如果我以这种方式编写代码,这将非常容易: 但是,如果使用“ update”语句,它将更加容易。但我的问题是,有可能同时完成这3个步骤吗? 问题答案: 引用Oracle事务处理语句文档: 事务是一个逻辑的 原子工作单元 ,包含一个或多个SQL语句。事务对SQL语句进行分组,以使它们要么全部提交(这意味着它

  • 插入、更新和删除语句基于以开头的层次结构生成 UpdateBase . 这个 Insert 和 Update 构建基于中介的 ValuesBase . DML基础构造函数 顶级的“插入”、“更新”、“删除”构造函数。 Object Name Description delete(table[, whereclause, bind, returning, ...], **dialect_kw) 构建

  • 问题内容: 我从下面的代码中获得,我可以找到原因。我可以成功地从csv文件读取数据,并创建一个名为课程列表的arraylist。那么我需要将其排序到一个数组列表,该数组的每个单元格都包含相同课程(名称相似的课程)的数组列表。但是当我运行它时会生成ConcurrentModificationException,我不明白为什么… 这是我的CourefileSorterclass: 问题答案: 将它们分