在交易期间版本不增加

时间:2012-04-04 09:44:48

标签: hibernate jpa optimistic-locking

我有以下情况:

  1. 交易开始
  2. person.getVersion() - >返回0
  3. person.setName( “脏”);
  4. session.save(人);
  5. person.getVersion() - >返回0
  6. 调用Session.flush()
  7. person.getVersion() - >返回1
  8. 交易提交
  9. 在不实际强制进行会话刷新或事务提交的情况下,如何在步骤4中获取更新版本?

    谢谢!

1 个答案:

答案 0 :(得分:3)

非常简单:

person.getVersion() + 1
你笑了吗?但正是这正是hibernate使用版本属性所做的。

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

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

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