Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/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
Java jpa在删除具有相同主键值的旧实体时创建新实体_Java_Jpa_Eclipselink - Fatal编程技术网

Java jpa在删除具有相同主键值的旧实体时创建新实体

Java jpa在删除具有相同主键值的旧实体时创建新实体,java,jpa,eclipselink,Java,Jpa,Eclipselink,考虑这样一种情况:用户删除具有主键值x的实体a,然后在同一事务中插入另一个具有相同主键值x的实体。然后提交事务。A有一个版本字段。新创建实体的版本字段为零,因此 发生乐观锁异常,表示在提交事务时,具有主键x的实体A可能已更新或删除。 我尝试了工作单元点应该首先执行删除,但出现了相同的结果。 有没有办法告诉jpa这是一个新实体 这是一种罕见的情况,在将新实体持久化到同一事务中之前,您可能希望先尝试刷新删除(这也将分离受影响的实体)。否则,您希望持久性提供者能够容忍持久性上下文中具有完全相同标识的两

考虑这样一种情况:用户删除具有主键值x的实体a,然后在同一事务中插入另一个具有相同主键值x的实体。然后提交事务。A有一个版本字段。新创建实体的版本字段为零,因此
发生乐观锁异常,表示在提交事务时,具有主键x的实体A可能已更新或删除。 我尝试了工作单元点应该首先执行删除,但出现了相同的结果。
有没有办法告诉jpa这是一个新实体

这是一种罕见的情况,在将新实体持久化到同一事务中之前,您可能希望先尝试刷新删除(这也将分离受影响的实体)。否则,您希望持久性提供者能够容忍持久性上下文中具有完全相同标识的两个不同实体共存。我所知道的任何一个持久性提供者都不会允许这种情况。正如esej在上面指出的那样,任何提供者都会将具有相同id的每个实体实例视为表示非常相同的实体,因此在持久性上下文中的给定时间只允许存在一个引用。在您的特殊情况下,新实体的持久化操作会导致在持久化上下文中删除实体的替换,甚至在提交并实际执行删除操作之前。因此,在提交时,提供者尝试做的唯一事情就是用新实体更新数据库。抛出乐观锁异常也就不足为奇了。

为什么先插入然后删除?你能不只是更新吗?它是一个新的实体吗?如果实体仍然具有相同的Id-它是相同的实体,对吗?您是否覆盖了这些实体中的equals?在同一个EntityManager中同时存在两个具有相同Id的实体是违反JPA规范的。唯一接近这一点的是获取删除的实体并重新保存它。我使用的是非同步扩展实体管理器,然后在用户按下保存按钮时加入事务。用户可以删除实体,然后创建另一个具有相同id的实体。这对用户/测试人员没有意义。所以这个案子是真实的