3

1.質問

クライアント側からのLAZY読み込みの既知の戦略、ソリューションは何ですか?私はこのようなものhttp://wiki.eclipse.org/Introduction_to_EclipseLink_Sessions_(ELUG)#Remote_Sessionsをチェックしていましたが、これが私の問題の解決策であるかどうか、またはこれを使用する方法がわかりません。

2.ユースケース

プレゼンテーション層(Eclipse RCP)がネットワーク経由のリモートクライアントである3層アプリケーションを開発しています。

[ Eclipse RCP ] <-----(RMI)-----> [ [EJB 3] [JPA 2] [Mysql] ]

現在、クライアントでも使用したいドメインモデルとしてJPAエンティティを使用しています。ネットワーク経由で@SessionBeanからエンティティを取得します。JPAエンティティにLAZYフィールドがある場合に問題が発生します。シリアル化後、特に私のJPAプロバイダー(EclipseLink)がネットワークの反対側にあるため、クライアントからこれらのLAZYフィールドをロードする戦略が必要です。

私は多くの実体を持つつもりです:多分30-40。そして、典型的なシナリオは、ユーザーが多くのフィールドを持つSomethingModelのリストをList表示する場合ですが、特定の要素を変更したい場合にのみ、それらをリストに表示する必要はありません。

3.考えられる解決策

私は1つの解決策を思いつきました。たとえば、クライアント側でJPAエンティティのプロキシクラスを作成します。ドメインモデルからのコレクションフィールドが必要な場合、プロキシクラスはリモートEJBを呼び出してフィールドにデータを入力します。

class CarModelClient {
  CarModel model;

  public String getColor(){
    model.getColor();
  }

  public List<Wheels> getWheels(){
    CarModelFacadeRemote carFacade = //get my remote ejb
    model.setWheels( carFacade.getWheels( model.getId() ) );
    return model.getWheels();
  }

}

まあ、それに似ています。

ご回答ありがとうございます。

4

1 に答える 1

1

クライアントがサーバー上にあり、エンティティマネージャーが常に開いているように、賢くなりすぎてふりをしないでください。DTOまたはJSONオブジェクトとまったく同じように、クライアント側でドメインオブジェクトを検討します。サーバーから送信され、ネットワーク経由でセラル化された情報を含むオブジェクトです。

クライアントから呼び出されたサービスメソッド(ファサードメソッド)を文書化して、初期化された関連付けと、返されたエンティティに含まれていない関連付けを指定します。たとえば、「リスト」画面を表示していて、リストの要素の1つの詳細ビューを表示したい場合は、データベースからエンティティを再度ロードする(したがって、新しい結果を取得する)別のサービスを呼び出します。エンティティに関する詳細を表示するために初期化された関連付け。

クライアントで遅延ロードされた関連付けを動的に初期化しようとしても機能しません。複雑で非効率的であり、クライアント上で廃止された一貫性のないグラフになり、トランザクションの分離が考慮されません。

于 2012-06-02T06:36:47.347 に答える