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

时间:2015-02-02 15:56:48

标签: java jpa eclipselink

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

1 个答案:

答案 0 :(得分:6)

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