我在JavaEE应用程序中使用JPA。我有一个持久性实体Stamp
,每次更新后每次尝试删除它时,我都会不断获取OptimisticLockException
(The object [domain.Stamp@473f5e6] cannot be merged because it has changed or been deleted since it was last read
)。
看来,尽管版本是在数据库中提交的,但是版本号从未在对象中递增(在DB中是递增的),因此,随后进行的任何合并尝试(以更新或删除)都会触发该异常。
基本上,该场景如下:
Stamp s
;em.persist(s);
(数据库和对象中的版本均为1)s
;em.merge(s);
(版本在DB中为2,在对象中为1)em.remove(this.em.merge(s));
显然,有些事情我不理解。为什么尽管进行了数据库提交,对象版本仍未更新?
您错过了em.merge(s);
将返回的合并Stamp
实例的s
事实s'
。因此,s'
将在步骤4之后保留新版本。在您的方案中,版本字段将/应等于2)。令人遗憾的是,对象(s
)的原始版本在其过时的对象状态下不会反映出更改(保留在数据库中)。
之后,您可以在第5步中使用该实例的该版本(s'
)Stamp
将其删除。注意:em.merge(s)
尽管第5步中的第二个操作不是必需的,因为-如果merge
正确使用了第4步中操作的先前返回值-保留上一次更新的更改:不仅反映在数据库中,还反映在对象(s'
)的状态中。
另请参见:javax.persistence.EntityManager.merge(...)
返回:状态被合并到的托管实例
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句