2

我有以下情况:

  1. 交易开始
  2. person.getVersion() --> 返回 0
  3. person.setName("脏");
  4. session.save(人);
  5. person.getVersion() --> 返回 0
  6. session.flush()
  7. person.getVersion() --> 返回 1
  8. 事务提交

在不实际强制会话刷新或事务提交的情况下,我该怎么做才能在步骤 4 中获取更新版本?

谢谢!

4

1 回答 1

3

很简单:做

person.getVersion() + 1

你会微笑吗?但这正是 hibernate 对 version 属性所做的事情。

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

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

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

于 2012-04-04T14:46:39.393 回答