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 し、更新前に確実に変更されるようにします。