2

私はJPAに比較的慣れておらず、エンティティを楽観的にロックおよび更新する方法について非常に混乱しています。プロジェクトでこれを一貫して処理するための一連の汎用メソッドが必要です。

エンティティの状態がわからないメソッド内からロック/リフレッシュ メソッドを呼び出している可能性があります。デタッチされた、または新しい/保存されていないエンティティ オブジェクトと、データベースから以前に読み取られたエンティティ オブジェクトが渡された可能性があります。簡単にするために、ユーティリティ メソッドですべての不測の事態を処理したいと考えています。意味的に私が実装しようとしているメソッドは次のとおりです。

MyEntity refreshAndLock(MyEntity e)
データベースからエンティティを再度読み取り、オプティミスティックにロックするか、まだデータベースに保存されていないエンティティに対して何もしません。分離されたエンティティも再読み取りおよびロックされ、管理されたバージョンが返されます。

MyEntity refresh(MyEntity e)
エンティティを再度読み取るか、データベースにまだ保存されていないエンティティに対しては何もしません。切り離されたエンティティも再読み込みされます。

MyEntity lockAndNotRefresh(MyEntity e)
メモリ内のエンティティのバージョンをロックします (既に古くなっている可能性があります)

ヒントやリンクはありがたく受け入れます。これについては明確なガイダンスを見つけることができませんでしたが、これは一般的な要件のように思われるため、驚いています。

4

1 に答える 1

1

第 1 に、私の主な推奨事項は次のとおりです。独自の汎用データ アクセス レイヤーを実装しようとしないでください。あなたはあなたEntityManagerのためにすべてのことをやっています。コードをシンプルに保ち、過度にエンジニアリングしないでください。一般的なレイヤーを使用すると、新しい問題が発生し、保守性が低下する可能性が非常に高くなります。

第 2 に、ロックについて決定するために、アプリケーションの典型的な使用例は何かを自問する必要があります。ロックは常にボトルネックとデッドロックの問題を引き起こします。したがって、アプリケーションが書き込みよりもはるかに多くの読み取りを行う場合、または同じエンティティに一度にアクセスする可能性が低い場合は、楽観的ロックを使用してから例外を処理することをお勧めします。JPA はバージョン管理を提供するため、他のスレッドがオブジェクトを変更したかどうかを常に知ることができます。悲観的ロックが本当に必要な場合は、その場合に合わせて設定してください。

于 2013-04-09T09:06:32.733 に答える