11.3.4. 定制自动版本化行为
对于特定的属性和集合,通过为它们设置映射属性optimistic-lock
的值 为false
,来禁止Hibernate的版本自动增加。这样的话,如果该属性 脏数据,Hibernate将不再增加版本号。
遗留系统的数据库Schema通常是静态的,不可修改的。或者,其他应用程序也可能访问同一数据 库,根本无法得知如何处理版本号,甚至时间戳。在以上的所有场景中,实现版本化不能依靠 数据库表的某个特定列。在<class>
的映射中设置 optimistic-lock="all"
可以在没有版本或者时间戳属性映射的情况下实现 版本检查,此时Hibernate将比较一行记录的每个字段的状态。请注意,只有当Hibernate能够比 较新旧状态的情况下,这种方式才能生效,也就是说, 你必须使用单个长生命周期Session
模式,而不能使用 session-per-request-with-detached-objects模式。
有些情况下,只要更改不发生交错,并发修改也是允许的。当你在<class>
的映射中设置optimistic-lock="dirty"
,Hibernate在同步的时候将只比较有脏 数据的字段。
在以上所有场景中,不管是专门设置一个版本/时间戳列,还是进行全部字段/脏数据字段比较, Hibernate都会针对每个实体对象发送一条UPDATE
(带有相应的 WHERE
语句 )的SQL语句来执行版本检查和数据更新。如果你对关联实体 设置级联关系使用传播性持久化(transitive persistence),那么Hibernate可能会执行不必 要的update语句。这通常不是个问题,但是数据库里面对on update点火 的触发器可能在脱管对象没有任何更改的情况下被触发。因此,你可以在 <class>
的映射中,通过设置select-before-update="true"
来定制这一行为,强制Hibernate SELECT
这个对象实例,从而保证, 在更新记录之前,对象的确是被修改过。