1

我试图删除一个具有唯一 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 可能会做一些糟糕的缓存或其他事情。我希望有人能给我一个好的答案!=)

更新:唯一 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

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

4

1 回答 1

2

编辑: 尝试显式启动和提交事务。

删除实体就像调用 EntityManager 方法 remove(Object entity) 一样简单,如下例所示。您删除的实体必须是托管的:也就是说,它必须先前已在当前持久性上下文中读取过。

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

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

于 2009-09-01T10:01:18.113 回答