0

OpenJPA の調査を開始したところです。OpenJPA が自分のニーズに対応しているかどうかを理解しようとしています。私は OpenJPA 同時実行制御についていくつか読んだことがあり、名前付きストアド プロシージャ (@NamedStoredProcedureQuery) を作成し、その結果セットを POJO インスタンスのリストにマップする方法を知っています。しかし、私は組み合わせを理解しておらず、特定のドキュメントを見つけることができませんでした...

JPA を介して SELECT/UPDATE/DELETE/INSERT 操作を実行せず、storedprocedure の結果を POJO にマップするためだけに使用すると、並行性を処理できますか?

問題は、ストアドプロシージャを使用してオブジェクトを選択し、後でそれらを変更するときに、別のストアドプロシージャを使用してそれらのオブジェクトを更新することです。私がそれを行う前に、別のストアドプロシージャが同じテーブルを更新したかどうかをどのように知ることができますか? POJO オブジェクトの状態を追跡しますか (@Entity でマークされていると仮定します)? テーブルにマップされているストアド プロシージャを呼び出す前に、テーブルにクエリを実行しますか (このオブジェクトをどのテーブルにマップできるかを JPA に伝えたとします)。

ありがとう!

4

1 に答える 1

0

私は OpenJPA を使用していませんが、これを分析する方法はほとんどありません。

最初の方法は、OpenJPA で Hibernate の showsql のような構成を探すことです。

次に試すことができるのは、クエリ ログを探すことです。MySQL はクエリ ログを提供します。

通常、Hibernate などの JPA プロバイダーは、1 対 1 のクエリを生成します。つまり、更新の場合、最初にテーブルに SELECT しません。JPA は、JPA プロバイダーが実装するロック機構も定義します。

https://blogs.oracle.com/carolmcdonald/entry/jpa_2_0_concurrency_and

これを分離レベルと組み合わせると、動作を調整するのに役立ちます。

さらに、チェックと更新を使用できます。次のクエリの効果への何か。

UPDATE some_table SET column_a = 456 where column_a = 123 and id = 1

最後に、ストアド プロシージャの使用に対するアドバイスです。JPA のユーティリティはベンダーに依存せず、ストアド プロシージャを使用することで軽減されます。

于 2012-08-03T15:44:47.493 に答える