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
)。
似乎虽然在数据库中提交了版本,但对象中的版本号永远不会递增(它在数据库中递增),因此任何后续的合并尝试(为了更新或删除)都会触发异常。
基本上,场景如下:
- 实例化新的
Stamp s
;
em.persist(s);
(数据库和对象版本均为1)
- 更新
s
;
em.merge(s);
(DB 中版本为 2,对象中为 1)
em.remove(this.em.merge(s));
显然,有些事情我不明白。尽管提交了数据库,为什么对象版本没有更新?
您错过了 em.merge(s);
将 return 合并 s
的 Stamp
实例这一事实,无论是 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
我在 JavaEE 应用程序中使用 JPA。我有一个持久实体 Stamp
,每次我尝试在更新后立即删除它时,我都会收到 OptimisticLockException
(The object [domain.Stamp@473f5e6] cannot be merged because it has changed or been deleted since it was last read
)。
似乎虽然在数据库中提交了版本,但对象中的版本号永远不会递增(它在数据库中递增),因此任何后续的合并尝试(为了更新或删除)都会触发异常。
基本上,场景如下:
- 实例化新的
Stamp s
; em.persist(s);
(数据库和对象版本均为1)- 更新
s
; em.merge(s);
(DB 中版本为 2,对象中为 1)em.remove(this.em.merge(s));
显然,有些事情我不明白。尽管提交了数据库,为什么对象版本没有更新?
您错过了 em.merge(s);
将 return 合并 s
的 Stamp
实例这一事实,无论是 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