🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 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`这个对象实例,从而保证, 在更新记录之前,对象的确是被修改过。