Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 删除实体,但在删除后使用相同的主键添加类似的实体_Jpa_Eclipselink_Toplink - Fatal编程技术网

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

Jpa 删除实体,但在删除后使用相同的主键添加类似的实体,jpa,eclipselink,toplink,Jpa,Eclipselink,Toplink,我正在尝试删除一个具有唯一PK的实体,如:80253 我通过执行以下代码行删除此实体: myEntityType1 = getEntityManager().find(MyEntityType1.class, 80253); getEntityManager().remove(myEntityType1); getEntityManager().flush(); 这些代码实际上正确地从我的数据库及其所有级联对象中删除了行,对此我非常高兴。现在,当我现在需要创建一个使用相同主键的类似实体(现在应

我正在尝试删除一个具有唯一PK的实体,如:80253

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

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();