11.3.3. 脱管对象(deatched object)和自动版本化

这种方式下,与持久化存储的每次交互都发生在一个新的Session中。 然而,同一持久化对象实例可以在多次与数据库的交互中重用。应用程序操纵脱管对象实例 的状态,这个脱管对象实例最初是在另一个Session 中载入的,然后 调用 Session.update()Session.saveOrUpdate(), 或者 Session.merge() 来重新关联该对象实例。

  1. // foo is an instance loaded by a previous Session
  2. foo.setProperty("bar");
  3. session = factory.openSession();
  4. Transaction t = session.beginTransaction();
  5. session.saveOrUpdate(foo); // Use merge() if "foo" might have been loaded already
  6. t.commit();
  7. session.close();

Hibernate会再一次在同步的时候检查对象实例的版本,如果发生更新冲突,就抛出异常。

如果你确信对象没有被修改过,你也可以调用lock() 来设置 LockMode.READ(绕过所有的缓存,执行版本检查),从而取 代 update()操作。