リモート メソッド呼び出しによって取得された Hibernate エンティティを初期化するにはどうすればよいですか?
質問
リモートサービスを呼び出すとき(例:RMI 経由)、Hibernate を使用してデータベースからエンティティのリストをロードする場合、クライアントが必要とするすべてのフィールドと参照を初期化するにはどうすればよいでしょうか?
例:クライアントはリモート メソッドを呼び出してすべての顧客をロードします。各顧客について、クライアントは顧客の購入した商品リストへの参照を初期化することを望んでいます。
次のような解決策が想像できます。
必要なフィールドを初期化する特別なクエリごとにリモートメソッドを記述します(例:Hibernate.initialize()) を実行し、ドメイン オブジェクトをクライアントに返します。
1のように。ただし DTO を作成する
クエリを複数のクエリに分割します。1 つは顧客用、もう 1 つは顧客の記事用で、結果の管理はクライアントに任せます
リモート メソッドは、クライアントによって作成され、サーバーによって実行される DetachedCriteria を受け取ります。
カスタムの「プリロード パターン」を開発します。クライアントがどのプロパティをプリロードするかを明示的に指定する方法。
解決
以前に1を使用しましたが、うまくいきました。
他のヒント
HQL に「fetch」句があるのは 5 番目の理由だと思います。それを使っていただけますか、それとも問題はもっと複雑ですか?
私は #5 でプロジェクトを標準化した顧客のところにいたことがありますが、それは非常にうまくいきました。サービス呼び出しの最後の引数は、ロードされるすべてのプロパティのカンマ区切りのリストでした。次に例を示します。
CustomerService.getCustomerById(id, "parent, address, address.city")
これには fetch 句が使用されたと思います。私は、PropertyUtils を使用して遅延読み込みをトリガーする同じアイデアを jpa に一度実装しました。
今回の遠隔サービスは・・・同じアプリケーションの別の部分ですか?そうであれば、クラスを共有し、インスタンスを送受信することに問題はありません (スタブを使用する RMI についても同様です)。
次に、Web サービスまたはそれに類似したものにアクセスするオプションがあります。この場合、通信する 2 つのアプリケーションはクラスを共有せず、これが事態をさらに複雑にします。近い将来、この問題に直面することになるので、その答えを知りたいと思っています。
とにかく、私は DTO に一票を投じます。これらは、該当する場合には最良かつ最も簡単なソリューションを提供し、コードをシンプルで保守しやすく保つのに役立つと思います。
ユヴァル=8-)
リモート サービスがクライアントにデータを提供するためだけに存在する場合は、すべての Hibernate エンティティの遅延読み込みをオフにすると役立つ場合があります。
ただし、個人的には、DTO が正しい方法だと考えています。リモート インターフェイスを DTO で表現することで、必要なものはすべて確実に得られ、予期せぬものは何も得られません。