删除实体,但在删除后使用相同的主键添加类似的实体

时间:2009-09-01 09:55:13

标签: jpa eclipselink toplink

我试图删除具有唯一PK的实体,如:80253

我通过以下代码行删除此实体:

myEntityType1 = getEntityManager().find(MyEntityType1.class, 80253);
getEntityManager().remove(myEntityType1);
getEntityManager().flush();

这些代码实际上会从我的数据库及其所有级联对象中正确删除行,我对此非常满意。现在问题发生在我现在需要创建一个使用相同主键的类似实体(现在它应该正确吗?)。

MyEntityType2 myEntityType2 = new MyEntityType2 ();
myEntityType2.copyData(myEntityType1); //access the data from the other object
//and retrieves the id 80253. myEntityType2 now has 80253 as ID.
getEntitymanager().persist(myEntityType2);

现在,这是我获得唯一约束SQL错误的地方。我试图插入一个已存在的ID,并自动回滚更改(旧实体不再被删除)。在我的记录器中看到toplink删除了旧实体的记录后,就会发生这种情况。

有谁知道这是怎么发生的,为什么它不起作用?为了记录,我尝试合并,关闭,清除entityManager,但似乎没有任何工作。

在我看来,JPA可能会做一些糟糕的缓存或其他事情。我希望有人对我有一个好的答案! =)

更新: Theres不再是唯一ID约束的问题,但是我创建了一个新的子类,它具有相同的主键,已被删除我得到以下异常:

Exception Description: Trying to invoke [setApprovedWhen] on the object [null].  The 
number of actual and formal parameters differs, or an unwrapping conversion has failed.
Internal Exception: java.lang.IllegalArgumentException: object is not an instance of 
declaring class

在我看来,它不会让我将对象更改为不同的子类?

1 个答案:

答案 0 :(得分:2)

修改 尝试显式启动和提交事务。

  

删除实体非常简单   调用EntityManager方法   remove(Object entity)如下所示   示例显示。您删除的实体   必须管理:也就是说,它必须有   以前在当前读过   持久化上下文。

entityManager.getTransaction().begin();
myEntityType1 = getEntityManager().find(MyEntityType1.class, 80253);
getEntityManager().remove(myEntityType1);
entityManager.getTransaction().commit(); 
  

交易完成后,或   你调用EntityManager方法flush(),   该实体将被删除。   在容器管理持久性中   上下文事务边界   将由容器控制。