11.3.3. 脱管对象(deatched object)和自动版本化
这种方式下,与持久化存储的每次交互都发生在一个新的Session
中。 然而,同一持久化对象实例可以在多次与数据库的交互中重用。应用程序操纵脱管对象实例 的状态,这个脱管对象实例最初是在另一个Session
中载入的,然后 调用 Session.update()
,Session.saveOrUpdate()
, 或者 Session.merge()
来重新关联该对象实例。
// foo is an instance loaded by a previous Session
foo.setProperty("bar");
session = factory.openSession();
Transaction t = session.beginTransaction();
session.saveOrUpdate(foo); // Use merge() if "foo" might have been loaded already
t.commit();
session.close();
Hibernate会再一次在同步的时候检查对象实例的版本,如果发生更新冲突,就抛出异常。
如果你确信对象没有被修改过,你也可以调用lock()
来设置 LockMode.READ
(绕过所有的缓存,执行版本检查),从而取 代 update()
操作。