Jpa 删除实体,但在删除后使用相同的主键添加类似的实体
我正在尝试删除一个具有唯一PK的实体,如:80253 我通过执行以下代码行删除此实体:Jpa 删除实体,但在删除后使用相同的主键添加类似的实体,jpa,eclipselink,toplink,Jpa,Eclipselink,Toplink,我正在尝试删除一个具有唯一PK的实体,如:80253 我通过执行以下代码行删除此实体: myEntityType1 = getEntityManager().find(MyEntityType1.class, 80253); getEntityManager().remove(myEntityType1); getEntityManager().flush(); 这些代码实际上正确地从我的数据库及其所有级联对象中删除了行,对此我非常高兴。现在,当我现在需要创建一个使用相同主键的类似实体(现在应
myEntityType1 = getEntityManager().find(MyEntityType1.class, 80253);
getEntityManager().remove(myEntityType1);
getEntityManager().flush();
这些代码实际上正确地从我的数据库及其所有级联对象中删除了行,对此我非常高兴。现在,当我现在需要创建一个使用相同主键的类似实体(现在应该是正确的?)时,问题就出现了
这就是我得到唯一约束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
在我看来,它不允许我将对象更改为不同的子类。编辑:
尝试显式启动并提交事务
删除实体非常简单
调用EntityManager方法
删除(对象实体),如下所示
示例显示。您删除的实体
必须管理:也就是说,它必须有
以前已在当前版本中读取
持久性上下文
交易完成时,或
调用EntityManager方法flush(),
实体将被删除。
在容器管理的持久性中
事务边界的上下文
将由容器控制
在上面的代码中,我删除了myEntityType1,如下所示:myEntityType1=getEntityManager().find(myEntityType1.class,80253);getEntityManager().remove(myEntityType1);getEntityManager().flush();在删除reight之前复制对象?对象本身从未被删除,但它不应再存在于数据库中,对吗?所以JPA将INSERT调用到查询中,PK不应再位于数据库中。我刚刚发现这样的想法:“就像persist和merge方法一样,DELETE(em.remove)语句不一定立即发出,而是保证在某个时刻发出。”。。。这可能是我的逻辑失败的地方。我以为flush会迫使它立即运行,所以说得很清楚-查找、复制、删除、flush、插入,这就是你要做的,按照这个顺序?我不能明确地启动和提交事务,因为JTA正在处理这个问题。flush()方法应该为我显式提交所有更改。如果我尝试使用该事务,我会得到以下异常:异常描述:在使用JTA时无法使用EntityTransaction。
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
entityManager.getTransaction().begin();
myEntityType1 = getEntityManager().find(MyEntityType1.class, 80253);
getEntityManager().remove(myEntityType1);
entityManager.getTransaction().commit();