0

同じドメイン オブジェクトに対して異なるエンティティ ロケーターを使用できるようにしたいと考えています。私が使用Twigしていて、オブジェクトを完全または部分的にロードするオプションがあります。ライト リクエストを実行すると、代わりにfetchRangeLiteロケータが使用されます。私の現在の実装は次のとおりです。TwigLocatorTwigLiteLocator

プロキシ

@ProxyFor(value = MyDomain.class, locator = TwigLocator.class)
public interface MyDomainProxy extends EntityProxy {}

@ProxyFor(value = MyDomain.class, locator = TwigLiteLocator.class)
public interface MyDomainLiteProxy extends EntityProxy {}

リクエスト

@Service(value = MyDao.class, locator = DaoServiceLocator.class)
public interface MyRequest extends RequestContext {
    Request<List<MyDomainProxy>> fetchRange(Integer start, Integer length);
    Request<Integer> getCount();
    Request<List<MyDomainLiteProxy>> fetchRangeLite(Integer start, Integer length);
}

ダオ

public List<MyDomain> fetchRange(Integer start, Integer length) {
  ...   
}

public List<MyDomain> fetchRangeLite(Integer start, Integer length) {
  ...   
}

ライトロケーターが使用されることを期待していましたが、そうではありません。では、RF は特定のドメイン タイプに使用するロケーターをどのように選択するのでしょうか?

アップデート

私のドメイン オブジェクトは、リストのリストで構成されています。

public class MyDomain extends DatastoreObject {
  private List<A> a;
}

public class A {
  private List<B> b;
}

オブジェクトのプロキシがMyDomainサーバーからクライアントに送信されると、すべての とすべてのTwigが読み込まれ、時間がかかります。オブジェクトのプロパティにのみ関心があるため、「ライト」ロケーターを使用したいと考えています。ABMyDomain

Twigロケーター

@Override
public DatastoreObject find(Class< ? extends DatastoreObject> clazz, Long id) {
    ObjectDatastore myDatastore = datastoreProvider.get();
    DatastoreObject object = myDatastore.load(clazz, id);
    return object;
}

TwigLiteロケーター

@Override
public DatastoreObject find(Class< ? extends DatastoreObject> clazz, Long id) {
    ObjectDatastore myDatastore = datastoreProvider.get();
    myDatastore.setActivationDepth(0);
    DatastoreObject object = myDatastore.load(clazz, id);
    return object;
}

myDatastore.setActivationDepth(0);MyDomainサブレベル (リスト)のプロパティではなく、プロパティのみを読み込むようにデータストアに指示します。

DAO の実装は同じであるため、ID とバージョンは両方のプロキシで同じです。

4

1 に答える 1

0

RF が「ライト」ロケーターを使用していない理由はわかりませんが、それが問題になる理由もわかりません。どのプロキシが使用されていても、MyDomain の ID とバージョンは同じであるべきではありませんか?

実際、この場合に 2 つの異なるロケーターが必要な理由がわかりません。「完全」または「ライト」フェッチは、ロケーターではなく DAO で行われます。2 つの異なるロケーターを使用する唯一の理由はfind、プロキシがクライアントからサーバーに送信されるときに、異なる方法で実装することです(findのデフォルトの実装でも使用されますisLiveが、通常は独自の実装でオーバーライドすることをお勧めします。デフォルトのものはすでに「最適化された」ものですfind(obj.getClass(), getId(obj)) != null:)

于 2011-07-16T11:20:52.980 に答える