JPA:事务在数据库中提交,但@Version未递增
我在JavaEE应用程序中使用JPA。我有一个持久的实体JPA:事务在数据库中提交,但@Version未递增,jpa,ejb,Jpa,Ejb,我在JavaEE应用程序中使用JPA。我有一个持久的实体戳记,我不断得到OptimisticLockException(对象[domain]。Stamp@473f5e6]无法合并,因为自上次读取以来,它已被更改或删除(每次更新后尝试删除一个时) 看起来,尽管版本在数据库中提交,但对象中的版本号永远不会增加(它在数据库中增加),因此任何后续的合并尝试(为了更新或删除)都会触发异常 基本上,情况如下: 实例化新的戳记s em.persist(s)(数据库和对象中的版本均为1) 更新s em.merg
戳记
,我不断得到OptimisticLockException
(对象[domain]。Stamp@473f5e6]无法合并,因为自上次读取以来,它已被更改或删除(每次更新后尝试删除一个时)
看起来,尽管版本在数据库中提交,但对象中的版本号永远不会增加(它在数据库中增加),因此任何后续的合并尝试(为了更新或删除)都会触发异常
基本上,情况如下:
实例化新的戳记s
李>
em.persist(s)代码>(数据库和对象中的版本均为1)
更新s
李>
em.merge代码>(数据库中的版本为2,对象中的版本为1)
em.remove(this.em.merge)代码>
显然,有些事我不明白。为什么在DB提交的情况下对象版本没有更新?您忽略了em.merge(s)
将返回一个合并的戳记实例s
,无论它是s'
。因此s'
将在步骤4之后保存新版本。在您的场景中,版本字段将/应该等于2)。遗憾的是,对象的原始版本(s
)不会反映其过时对象状态中的更改(保留在数据库中)
之后,您可以使用此Stamp
实例的此版本(s'
)在步骤5中删除它。注意:尽管步骤5中的第二个em.merge
操作不是必需的,因为-如果步骤4中的merge
操作的上一个返回值使用正确-它包含上一次更新的更改:反映在数据库中,但也反映在对象的状态中(s'
)
另见:
返回:
状态合并到的托管实例
实际上,我确实检索了由merge
返回的更新引用,但它没有传播到应用程序中的正确位置。你是对的,我没有看到正确的物体。非常感谢。旁白,第5步的merge
之所以出现在这里,是因为序列不是硬编码的,每个步骤都采用不同的方法,并且第4步的merge
不一定发生。我同意这种方式看起来很奇怪。我想知道你为什么在第5步进行合并。也许,这取决于处理持久性问题的体系结构。但不管怎样,很高兴答案对你有帮助