我在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));
显然,有些事我不明白。尽管数据库提交,为什么对象版本没有更新?
答案 0 :(得分:2)
您错过了em.merge(s);
将返回合并Stamp
s
实例的事实,无论是s'
。因此s'
将在步骤4之后保留新版本。在您的方案中,版本字段将/应该等于2)。遗憾的是,对象的原始版本(s
)不会反映其过时对象状态中的更改(在数据库中保留)。
之后,您可以使用此s'
实例的此版本(Stamp
)在步骤5中删除它。注意:步骤5中的第二个em.merge(s)
操作不是必需的, as - 如果正确使用了步骤4中merge
操作的上一个返回值 - 它保存了先前更新的更改:反映在数据库中,但也反映在对象的状态中(s'
)
另见: javax.persistence.EntityManager.merge(...)
返回: 状态合并到
的托管实例