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

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

空英逸
2023-03-14

我在Spring Data JPA/EclipseLink环境中有一个实体(其主键不是由序列生成的),如下所示:

@Entity
@Table(name="MY_ENTITY")
public class MyEntity implements Serializable {

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

    \\other columns
}

并且我正在尝试从表中删除一行并重新插入它(使用相同的主键)。

我的方法是调用deleteAll()来清理表,然后保存()新的实体:

    @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方法,并测试问题是否仍然存在。

 类似资料:
  • 但这给了我这个错误: 我做错了什么?我不明白为什么它试图合并实体,而不是简单地在删除后重新插入它。 谢谢你的帮助!

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

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

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

  • 我试图通过合并排序对数组进行排序,并在排序时删除我认为相等的元素。我递归调用合并排序,然后合并。 到了这一点,我发现a和c是重复的。 我根据特定的标准决定我想要哪一个,我选择c。我递增右手计数器和左手计数器,比较b和d。假设我选择d,然后我选择b。我希望我的最终列表只有元素 但是,发生的事情是在下一个递归调用中,和是0和3,因此d在下一次调用时在数组中列出两次。合并过程使用的数组是: 这是代码。提

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