2

我正在尝试关闭组件中特定字段的乐观锁定。在组件级别关闭(适用于组件中的所有字段)有效。但不适用于组件中的特定字段。我正在使用休眠 3.2.x

让我解释一下这个问题

成员.hbm.xml

   <class name="com.test.core.model.member.Member" abstract="true"
    table="MEMBER" optimistic-lock="dirty" dynamic-update="true"
    polymorphism="explicit" discriminator-value="LITE">
    .....
    .....
    <component name="helper" class="com.test.core.model.Helper">
        <property name="status">
            <column name="STATUS" />
            <type name="org.hibernate.type.EnumType">
                <param name="enumClass">
                    com.test.core.model.Helper$Status
                </param>
            </type>
        </property>
        <property name="changeXML" type="string">
            <column name="CHANGE_XML" />
        </property>
        <property name="lastChange" type="timestamp">
            <column name="LAST_CHANGE" />
        </property>
    </component>
</class>
</hibernate-mapping>

我被限制在类级别使用optimistic-lock="dirty",所以我不能切换到“版本”。但是,希望通过休眠对组件内的 changeXML 字段禁用乐观检查。

所以我改变了

<property name="changeXML" type="string" >
to
<property name="changeXML" type="string" optimistic-lock="false">

因为这是在组件中,所以由于某种原因不遵守此设置。因此,hibernate 在提交对 changeXML 的更新之前会在内部生成验证查询。

即更新 MEMBER SET CHANGE_XML ="NEWVALUE" WHERE ID=SOMETHING AND CHANGE_XML=OLDVALUE

但是在组件级别发生变化,即从

<component name="helper" class="com.test.core.model.Helper">
to 
<component name="helper" class="com.test.core.model.Helper" optimistic-lock="false"> 

通过尊重此设置来工作,并且休眠不会生成更新语句

我们无法解决在组件级别更改的选项,因为对“状态”的并发更新是预期的,并且不会因 staleobjectstateexception 而失败。

有没有办法告诉hibernate尊重组件中的optimistic-lock="false"设置?

感谢您花时间阅读..

4

1 回答 1

1

The property attribute optimistick-lock should do the trick:

specifies that updates to this property do or do not require acquisition of the optimistic lock. In other words, it determines if a version increment should occur when this property is dirty.

Try updating hibernate to a newer version, like 3.5.6 for instance.

于 2015-01-25T19:34:45.450 回答