2011-05-13 3 views
2

私は、オプティミスティックな並行性制御を実装するために、バージョン列でHibernateを使用しています。汚れていてもいなくても、Hibernateでの保存時にバージョンフィールドを増やす方法は?

質問:エンティティのバージョン番号を変更するかどうかにかかわらず、データベースに保存するたびにその番号を増やすことはできますか?

エンティティでフィールドが変更されている限り、バージョン番号は増加します。ただし、エンティティでフィールドが変更されていない場合、エンティティのバージョン番号は変更されません。

この問題の背景には、2つのテーブルの間に論理的なマスター/ディテール関係があり、マスターデータが詳細に変更された場合でも、マスターテーブルのバージョン番号を増やしたいと思います。 t変化。このマスターディテール関係は、Hibernateにマップされません。私はいつも一緒に単一のトランザクションでそれらを保存します。

+0

インターセプタを使用してバージョンの更新をトリガしましたか? – Fil

+0

私はまだインターセプタで作業していません。例がありますか?私が理解する限り、* findDirty(...)*関数を上書きすることで、エンティティをダーティとマークするだけで十分です。 – MicSim

+0

私はそれらを主に監査目的で使用しましたが、さまざまなイベント(postFlush、postFlushDirtyなど)後にエンティティへのアクセス権を付与します。ディテールがフラッシュされると、マスター上のバージョン番号を更新する2番目の呼び出しを行うことができます。 – Fil

答えて

2

ディテールが変更されたことを識別すると、Hibernateインターセプタを使用してマスタレコードのバージョン番号を更新できます。

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/events.html

1つの制限は、この溶液は、休止状態に特異的であるということです。 JPAでは、アノテーション(PostPersist、PostUpdateなど)を使用したイベント駆動型ロジックを使用することもできますが、これらのメソッドでは、基礎となるセッションにアクセスすることはできません(さらに重要なことに、これらのメソッドを使用してセッションを変更する注意データ)。私は通常、監査を実行するためにインターセプタを使用しましたが、レコードが変更されたときにバージョン番号を更新するように簡単に拡張できます。

0

lock()(またはLockModeをとる他の方法)をLockMode.OPTIMISTIC_FORCE_INCREMENTと呼び出すことができます。

+0

これについての未解決の問題があります(http://opensource.atlassian.com/projects/hibernate/browse/HHH-5222および修正されると主張する前任者5032も参照してください)が、それでも私はそれをチェックします。 – MicSim

+0

私はあなたの提案をチェックしましたが、残念ながら上記のJIRAの問題で言及されているのと同じバグが原因で動作していません。 – MicSim

関連する問題