2

コンポーネント内の特定のフィールドの楽観的ロックをオフにしようとしています。コンポーネント レベルでオフにすると (コンポーネント内のすべてのフィールドに適用されます)、機能します。ただし、コンポーネント内の特定のフィールドではありません。休止状態 3.2.x を使用しています

問題について詳しく説明しましょう

Member.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" を使用するように制限されているため、"version" に切り替えることができません。ただし、コンポーネント内の 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 で失敗しないため、コンポーネント レベルで変更するオプションで解決することはできません。

コンポーネント内の optimistic-lock="false" 設定を尊重するように hibernate に指示する方法はありますか?

読んでくれてありがとう..

4

1 に答える 1

1

プロパティ属性optimistick-lockでうまくいくはずです:

このプロパティの更新で楽観的ロックの取得が必要かどうかを指定します。つまり、このプロパティがダーティな場合にバージョンをインクリメントするかどうかを決定します。

たとえば、休止状態を 3.5.6 などの新しいバージョンに更新してみてください。

于 2015-01-25T19:34:45.450 に答える