6

Hibernate を使用してデータベースからエンティティのリストをロードするためにリモート サービス (RMI 経由など) を呼び出す場合、クライアントが必要とするすべてのフィールドと参照を初期化するには、どのように管理すればよいでしょうか?

例: クライアントがリモート メソッドを呼び出して、すべての顧客を読み込みます。クライアントは、顧客ごとに、顧客の購入商品リストへの参照を初期化する必要があります。

次の解決策を想像できます。

  1. 必要なフィールド (Hibernate.initialize() など) を初期化し、ドメイン オブジェクトをクライアントに返す、特別なクエリごとにリモート メソッドを記述します。

  2. 1. と同様ですが、DTO を作成します

  3. クエリを複数のクエリに分割します。たとえば、1 つは顧客用、もう 1 つは顧客の記事用であり、クライアントが結果を管理できるようにします。

  4. リモート メソッドは、クライアントによって作成され、サーバーによって実行される DetachedCriteria を取ります。

  5. カスタムの「Preload-Pattern」を開発します。つまり、クライアントがプリロードするプロパティを明示的に指定する方法です。

4

5 に答える 5

1

5番目は、HQLに「フェッチ」句がある理由だと思います。それを使用できますか、それとも問題はもっと複雑ですか?

于 2008-09-23T08:28:54.147 に答える
1

私は、#5 でプロジェクトを標準化した顧客のところに行ったことがありますが、それは非常にうまく機能しました。サービス呼び出しの最後の引数は、ロードするすべてのプロパティのコンマ区切りのリストでした。次に例を示します。

CustomerService.getCustomerById(id, "parent, address, address.city")

これには fetch 句を使用したと思います。PropertyUtils を使用して jpa に同じアイデアを一度実装して、遅延読み込みをトリガーしました。

于 2008-09-23T09:03:30.613 に答える
1

私は過去に1を使用しましたが、うまくいきました。

于 2008-09-23T08:07:11.873 に答える
0

クライアントにデータを提供するためだけにリモートサービスが存在する場合は、すべてのHibernateエンティティで遅延読み込みをオフにすると役立つ場合があります。

ただし、個人的には、DTOが正しい方法だと思います。リモートインターフェイスをDTOで表現することにより、必要なものすべてを確実に入手でき、予期していなかったものは何も得られません。

于 2008-09-23T09:27:34.533 に答える
0

このリモート サービスは、同じアプリケーションの別の部分ですか? そうであれば、クラスを共有したり、インスタンスをやり取りしたりするのに問題はありません (スタブを使用する RMI の場合も同様です)。

次に、通信する 2 つのアプリケーションがクラスを共有しない Web サービスなどにアクセスするオプションがあり、これが事態をさらに複雑にします。私は近い将来、この問題に直面しようとしています。その答えを知りたいと思っています。

とにかく、私の投票は DTO です。それらは、適用可能な場合に最適で最も簡単なソリューションを提供し、コードをシンプルで保守しやすいものに保つのに役立つと思います。

ユヴァル=8-)

于 2008-09-23T08:34:08.797 に答える