11.3.4. 自動バージョニングのカスタマイズ
マッピングの
optimistic-lock
属性に false
を設定することにより、特定のプロパティやコレクションのために自動バージョンインクリメントを無効にできます。プロパティがダーティであっても、バージョンをインクリメントしません。
レガシーのデータベーススキーマは通常、静的であり、変更できません。または、他のアプリケーションが同じデータベースにアクセスしなければならず、そのアプリケーションはバージョン番号やタイムスタンプさえ処理する方法を知りません。どちらの場合も、テーブルの特定のカラムを当てにして、バージョニングを行えません。バージョンやタイムスタンプのプロパティをマッピングせずに、バージョンチェックさせるために、
<class>
マッピングに optimistic-lock="all"
を指定してください。行のすべてのフィールドの状態を比較するようになります。これは、Hibernate が古い状態と新しい状態を比較できる場合にのみ、理論上では動作します。(すなわち、 session-per-request-with-detached-objects ではなく、1つの長い Session
を使う場合です)。
行われた変更が重ならないインスタンスに限り、同時に行われた変更を受け入れることができます。
<class>
のマッピング時に optimistic-lock="dirty"
を設定した場合、Hibernate はフラッシュ時にダーティフィールドのみを比較します。
専用のバージョン/タイムスタンプのカラムを使う場合、もしくはすべて/ダーティのフィールドを比較する場合どちらであっても、Hibernate はエンティティごとに1つの
UPDATE
文を 適切な WHERE
節と共に使い、バージョンチェックと情報の更新を行います。関連するエンティティの再追加をカスケードするために、連鎖的な永続化を使用した場合、不必要な更新を実行するかもしれません。これは通常問題になりませんが、分離したインスタンスを変更していなくとも、データベースの on update トリガーが実行されるかもしれません。<class>
マッピングに select-before-update="true"
を設定することによって、この振る舞いをカスタマイズできます。こうすることでHibernateが行の必ずインスタンスを SELECT
し、更新前に確実に変更されるようにします。