Hibernate 事务处理期间版本未增加

Hibernate 事务处理期间版本未增加,hibernate,jpa,optimistic-locking,Hibernate,Jpa,Optimistic Locking,我有以下情况: 交易开始 person.getVersion()-->返回0 person.setName(“脏”) 会话。保存(个人) person.getVersion()-->返回0 session.flush() person.getVersion()-->返回1 事务提交 在步骤4中,如果不强制执行会话刷新或事务提交,我可以如何获得更新版本 谢谢大家! 非常简单:做 person.getVersion() + 1 你微笑吗?但这正是hibernate对version属性所做的 在更新

我有以下情况:

  • 交易开始
  • person.getVersion()-->返回0
  • person.setName(“脏”)
  • 会话。保存(个人)
  • person.getVersion()-->返回0
  • session.flush()
  • person.getVersion()-->返回1
  • 事务提交
  • 在步骤4中,如果不强制执行会话刷新或事务提交,我可以如何获得更新版本

    谢谢大家!

    非常简单:做

    person.getVersion() + 1
    
    你微笑吗?但这正是hibernate对version属性所做的

    在更新到数据库时,hibernate从数据库重新加载记录,并将版本值与java对象的版本值进行比较。如果它们相同,则hibernate将版本值增加1,并将新记录存储到数据库中,否则将引发异常。其思想是,如果任何其他应用程序同时修改记录,则修改的值不得被覆盖,并且我们的应用程序必须重新加载数据并修改新值

    当然,当java对象中的任何值被修改时,hibernate可以第一次修改版本值。但是,每次修改值时,hibernate都必须检查对象是否被修改(新值可以与旧值相同;在这种情况下,不需要更新),并且必须标记版本值是否已经增加。如果你什么都没赢,为什么要这么做


    顺便说一下,hibernate不会在save()时刻更新数据库记录,而是在flush()或commit()时刻更新数据库记录,因为这样可以重新排序数据库语句以获得更好的性能。

    感谢您的回复,Johanna!是的,我知道这个版本背后的理论以及Hibernate是如何在内部实现的,但我不知道如何从事务内部获得新版本(没有v+1的东西——它实际上让我笑了:)。在我看来,我想这是不可能的。无论如何,这看起来是一个非常合理的解释——我喜欢最后一部分,解释为什么Hibernate不在事务中进行版本增量。这让我对Hibernate有了更好的理解。谢谢