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

JPA:事务在数据库中提交,但@Version未递增,jpa,ejb,Jpa,Ejb,我在JavaEE应用程序中使用JPA。我有一个持久的实体戳记,我不断得到OptimisticLockException(对象[domain]。Stamp@473f5e6]无法合并,因为自上次读取以来,它已被更改或删除(每次更新后尝试删除一个时) 看起来,尽管版本在数据库中提交,但对象中的版本号永远不会增加(它在数据库中增加),因此任何后续的合并尝试(为了更新或删除)都会触发异常 基本上,情况如下: 实例化新的戳记s em.persist(s)(数据库和对象中的版本均为1) 更新s em.merg

我在JavaEE应用程序中使用JPA。我有一个持久的实体
戳记
,我不断得到
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步进行合并。也许,这取决于处理持久性问题的体系结构。但不管怎样,很高兴答案对你有帮助