JPA:事务已在数据库中提交,但@Version 未递增

JPA: transaction is committed in the database, but @Version is not incremented

我在 JavaEE 应用程序中使用 JPA。我有一个持久实体 Stamp,每次我尝试在更新后立即删除它时,我都会收到 OptimisticLockException (The object [domain.Stamp@473f5e6] cannot be merged because it has changed or been deleted since it was last read)。

似乎虽然在数据库中提交了版本,但对象中的版本号永远不会递增(它在数据库中递增),因此任何后续的合并尝试(为了更新或删除)都会触发异常。

基本上,场景如下:

  1. 实例化新的Stamp s;
  2. em.persist(s);(数据库和对象版本均为1)
  3. 更新s
  4. em.merge(s);(DB 中版本为 2,对象中为 1)
  5. em.remove(this.em.merge(s));

显然,有些事情我不明白。尽管提交了数据库,为什么对象版本没有更新?

您错过了 em.merge(s); 将 return 合并 sStamp 实例这一事实,无论是 s'。因此 s' 将在第 4 步之后保留新版本。在您的场景中,版本字段 will/should 等于 2)。遗憾的是,对象的原始版本 (s) 不会反映其过时对象状态中的更改(保留在数据库中)。

之后,您可以使用此 Stamp 实例的此版本 (s') 在步骤 5 中将其删除。注意:步骤 5 中的第二个 em.merge(s) 操作不是必需的虽然,因为 - 如果正确使用了步骤 4 中 merge 操作的前一个 return 值 - 它保留了上一次更新的更改:反映在您的数据库中,但也反映在对象的状态中( s').

另请参阅: javax.persistence.EntityManager.merge(...)

Returns: the managed instance that the state was merged to