我试图删除具有唯一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
在我看来,它不会让我将对象更改为不同的子类?
答案 0 :(得分:2)
修改强> 尝试显式启动和提交事务。
删除实体非常简单 调用EntityManager方法 remove(Object entity)如下所示 示例显示。您删除的实体 必须管理:也就是说,它必须有 以前在当前读过 持久化上下文。
entityManager.getTransaction().begin();
myEntityType1 = getEntityManager().find(MyEntityType1.class, 80253);
getEntityManager().remove(myEntityType1);
entityManager.getTransaction().commit();
交易完成后,或 你调用EntityManager方法flush(), 该实体将被删除。 在容器管理持久性中 上下文事务边界 将由容器控制。