我在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)
....
我做错了什么?我不明白为何要将该实体合并,而不是简单地将其删除后重新插入。
谢谢你的帮助!
直接回答你的问题:
问题是,您试图保存的实体已经有一个持久标识,即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) 构建