私の質問はこれです: ステートレス Web アプリケーションで JPA の役割はありますか?merge
merge
JPAでの操作については、SOに関する多くの議論があります。より手動の Do-It-Yourself プロセス (エンティティ マネージャーを介してエンティティを見つけて変更を加える) による JPA マージとは対照的な、この件に関する優れた記事もあります。
@Version
私のアプリケーションには、楽観的ロックを利用するために注釈を使用するリッチ ドメイン モデル (ala ドメイン駆動設計) があります。また、RESTful Web サービスの一部としてネットワーク経由で送信する DTO も作成しました。この DTO 層の作成により、クライアントに必要なものすべてを送信し、不要なものを送信することもできます。
これまでのところ、これがかなり典型的なアーキテクチャであることは理解しています。私の質問は、既存のオブジェクトを更新 (つまり、HTTP PUT) する必要があるサービス メソッドについてです。この場合、1) JPA Merge と 2) DIY の 2 つのアプローチがあります。
私が理解していないのは、JPAマージが更新を処理するためのオプションと見なされることさえあるということです。これが私の考えであり、私が理解できないことがあるかどうか疑問に思っています:
1) ワイヤ DTO から切り離された JPA エンティティを適切に作成するには、バージョン番号を正しく設定する必要があります。そうしないと、OptimisticLockException がスローされます。しかし、JPAの仕様には次のように書かれています:
エンティティは、バージョン フィールドまたはプロパティの状態にアクセスしたり、アプリケーションがバージョンにアクセスするために使用するメソッドをエクスポートしたりできますが、バージョン値を変更してはなりません[30]。オブジェクトの version 属性の値を設定または更新できるのは、持続性プロバイダーだけです。
2) Merge は双方向のリレーションシップを処理しません...後ろ向きのフィールドは常に null になります。
3) フィールドまたはデータが (部分的な更新のために) DTO から欠落している場合、JPA マージはそれらの関係を削除するか、それらのフィールドを無効にします。Hibernate は部分的な更新を処理できますが、JPA マージは処理できません。DIY は部分的な更新を処理できます。
4) マージ メソッドが最初に行うことは、データベースにエンティティ ID をクエリすることです。そのため、DIY よりもパフォーマンス上の利点はありません。
5) DYI 更新では、エンティティをロードし、DTO に従って変更を行います。JPAコンテキストは作業単位パターンをすぐに実装するため、 merge
呼び出しも呼び出しもありません。persist
私はこれをまっすぐに持っていますか?
編集:
6) 遅延ロードされたリレーションシップに関するマージの動作は、プロバイダー間で異なる場合があります。