2012-01-12 20 views
5

私たちは、オプティミスティック・ロックで休止状態を使用しています。 私たちのエンティティはすべて、@versionアノテーションを持っています。hibernate stalestateExceptionの最適な更新戦略

これはうまくいきます。ユーザーが古くなったオブジェクトを保存しようとすると、stalestateexceptionが発生します。 このケースでは、変更を破棄したり、データベースの現在の値を上書きするための通知画面をユーザに提供したいと考えています。

これは、古い状態の例外の一般的な使用例です。 私の質問はこのユースケースに関連しています。ユーザーが現在のデータベース行を変更して上書きすることを決定した場合、最善の戦略は何ですか?私は、休止状態の参照ガイドと異なるWebサイトを見てきましたが、あなたがstalestateexceptionを自分自身で捕まえなければならないという事実があり、その後、データの上書きをprogrammaticalyで処理する必要があります。 私はhibernateがこの戦略を単純化するいくつかのユーティリティを持っているのだろうと思っています。ユーザーが自分のデータを上書きすることを決定した場合、データベースからエンティティの最後のバージョンを取得し、変更されたオブジェクトをデータベースに保存し直します。 しかし、より洗練されたソリューションがないのだろうかと疑問を感じることはありません。

答えて

1

このエリアの要件が非常に複雑で、特注である可能性があるため、Hibernateはこれを手伝ってくれません。

ユーザーが他のユーザーによって同時に変更されたオブジェクトを保存する場合は、単にオブジェクトを読み込んですべての変更されたフィールドをコピーし、他のすべてのユーザーの変更を元に戻したくないと思います。両方のユーザーが同じフィールドを変更した場合はどうなりますか?あなたは、2つのバージョンをユーザーに提示して、どのバージョンが正しいかを判断するようにしたいと思うかもしれません。バージョン管理システムの変更をマージするようなビット。

また、バックエンドの同じエンティティの2つのバージョンを単にマージして永続化させると、違反する可能性のあるフィールドをリンクするUIレベルの検証があるかもしれません。

+0

実際には、「マージUI」を作成することがあります。 しかし、データが上書きされるほど重要ではないユースケースがいくつかあります。このためのデフォルトメソッドがあるのか​​、自分でアルゴリズムを書く必要があるのか​​疑問に思っていました。 –

+0

私は恐れていることを認識していません。 –

+1

しかしそれは良い質問です。私はこの状況に取り組むための最善の方法について考えるのにかなりの時間を費やしました! –

0

私の経験では、この場合、いくつかの自動化を導入するために、私は次のトリックをしていました。私はエンティティをリロードし、それ以前の保存に失敗した古いオブジェクトに最後のバージョンの値を設定します。それから私はmerge()私の古いオブジェクトを渡しました。そうすれば、すべてのフィールドが上書きされ、バージョンは最新で保存可能になります。もちろん、関連するすべての参照は同じ方法で処理する必要があります。

関連する問題