2012-02-28 7 views
8

私はRequestFactoryに新しいが、Thomas Broyerの寛大な助けを借りて、それははるかに良くなっています下記の書類を確認した後だ:)RequestFactory theory:Locator <>。find()が頻繁に呼び出されるのはなぜですか?

しかし、あなたはしてもらえなぜLocator<>.find()が(なぜ私の意見では)不必要に呼ばれているのかを説明してください。

私のサンプルプロジェクトでは、親子関係を維持するOrganizationとPersonという2つのエンティティがあります。組織Objectify を自動的に取得すると、が子Personを自動的に取得します。 また、オブジェクトをロードして永続化するサービスレイヤーの2つのメソッドfindOrganizationByIdsaveOrganizationを作成しました。私はすでにオブジェクトの完全なグラフを受け取ったOrderDao.findOrganizationByIdを呼び出すことにより

OrderDao.findOrganizationById(1) 
PojoLocator.getId(Key<?>(Organization(1))) 
PojoLocator.getId(Key<?>(Organization(1)/Person(2))) 
PojoLocator.getId(Key<?>(Organization(1))) 
PojoLocator.find(Key<?>(Organization(1))) 
PojoLocator.getId(Key<?>(Organization(1)/Person(2))) 
PojoLocator.find(Key<?>(Organization(1)/Person(2))) 

:私は次のクライアントでfindOrganizationByIdを呼び出すと

呼び出しは、サーバー側で発生します。

は今2つのシナリオを検討してください。なぜそれに加えて.findを2回呼び出すのですか? Datastoreに余分な負担がかかります。もちろん私はそれをキャッシュしますが、それを修正するのはすてきです。これらの追加通話を避けるにはどうすればよいですか?

クライアントでsaveOrganizationを呼び出してオブジェクトを保存すると、同様のことが起こります。以下の呼び出しは、サーバー側で発生します。

PojoLocator.find(Key<?>(Organization(1))) 
PojoLocator.find(Key<?>(Organization(1)/Person(2))) 
OrderDao.saveOrganization(1) 
PojoLocator.getId(Key<?>(Organization(1))) 
PojoLocator.find(Key<?>(Organization(1))) 
PojoLocator.getId(Key<?>(Organization(1)/Person(2))) 
PojoLocator.find(Key<?>(Organization(1)/Person(2))) 

が、私はそれを更新前に、データストアから2つのオブジェクトを取得するための必要性を理解することができます。 RequestFactoryはサーバーにデルタを送信するので、永続化する前にオブジェクト全体を保持する必要があります。それでも私は一度に完全なグラフをロードするので、第二の呼び出しがないことがうれしいでしょう。それはPojoLocator.find(Key<?>(Organization(1)/Person(2)))です。そして、私は本当に.find()の後にを呼び出す必要性を理解できない。

思考?

マイプロキシ

@ProxyFor(value = Organization.class, locator = PojoLocator.class) 
public interface OrganizationProxy extends EntityProxy 
{ 
    public String getName(); 
    public void setName(String name); 
    public String getAddress(); 
    public void setAddress(String address); 
    public PersonProxy getContactPerson(); 
    public void setContactPerson(PersonProxy contactPerson); 
    public EntityProxyId<OrganizationProxy> stableId(); 
} 

@ProxyFor(value = Person.class, locator = PojoLocator.class) 
public interface PersonProxy extends EntityProxy 
{ 
    public String getName(); 
    public void setName(String name); 
    public String getPhoneNumber(); 
    public void setPhoneNumber(String phoneNumber); 
    public String getEmail(); 
    public void setEmail(String email); 
    public OrganizationProxy getOrganization(); 
    public void setOrganization(OrganizationProxy organization); 
} 

マイサービス

public interface AdminRequestFactory extends RequestFactory 
{ 
    @Service(value = OrderDao.class, locator = InjectingServiceLocator.class) 
    public interface OrderRequestContext extends RequestContext 
    { 
     Request<Void> saveOrganization(OrganizationProxy organization); 
     Request<OrganizationProxy> findOrganizationById(long id); 
    } 

    OrderRequestContext contextOrder(); 
} 

、最終的には私のロケータ<>

public class PojoLocator extends Locator<DatastoreObject, String> 
{ 
    @Inject Ofy ofy; 

    @Override 
    public DatastoreObject create(Class<? extends DatastoreObject> clazz) 
    { 
     try 
     { 
      return clazz.newInstance(); 
     } catch (InstantiationException e) 
     { 
      throw new RuntimeException(e); 
     } catch (IllegalAccessException e) 
     { 
      throw new RuntimeException(e); 
     } 
    } 

    @Override 
    public DatastoreObject find(Class<? extends DatastoreObject> clazz, String id) 
    { 
     Key<DatastoreObject> key = Key.create(id); 
     DatastoreObject load = ofy.load(key); 
     return load; 
    } 

    @Override 
    public Class<DatastoreObject> getDomainType() 
    { 
     return null; // Never called 
    } 

    @Override 
    public String getId(DatastoreObject domainObject) 
    { 
     Key<DatastoreObject> key = ofy.fact().getKey(domainObject); 
     return key.getString(); 
    } 

    @Override 
    public Class<String> getIdType() 
    { 
     return String.class; 
    } 

    @Override 
    public Object getVersion(DatastoreObject domainObject) 
    { 
     return domainObject.getVersion(); 
    } 
} 

答えて

6

終わりgetIdfindのペアはLocator#isLiveのデフォルトの実装です: それオブジェクトがlive(すなわち、データストア内にまだ存在しています)、IDで見つかった場合はnull以外の値を返します。

RFチェック、それが今までエンティティは、クライアント側で(削除されたときにクライアントに通知するために、応答を構築するとき、それはその後、EntityProxyChangeイベントを発生思い彼らのライブネスの要求/応答の際に見られた各EntityProxyあなたは1を提供できるかどうDELETE書き込み操作

であなたはもちろん、より最適化された実装を使用してLocatorisLiveをオーバーライドすることができます。

+0

を上書きした後 'isLiveの各()'私はそれが正しい答えだことを確認しました。 – expert

関連する問題