私はRequestFactoryに新しいが、Thomas Broyerの寛大な助けを借りて、それははるかに良くなっています下記の書類を確認した後だ:)RequestFactory theory:Locator <>。find()が頻繁に呼び出されるのはなぜですか?
しかし、あなたはしてもらえなぜLocator<>.find()
が(なぜ私の意見では)不必要に呼ばれているのかを説明してください。
私のサンプルプロジェクトでは、親子関係を維持するOrganizationとPersonという2つのエンティティがあります。組織Objectify を自動的に取得すると、が子Personを自動的に取得します。 また、オブジェクトをロードして永続化するサービスレイヤーの2つのメソッドfindOrganizationById
とsaveOrganization
を作成しました。私はすでにオブジェクトの完全なグラフを受け取った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();
}
}
を上書きした後 'isLiveの各()'私はそれが正しい答えだことを確認しました。 – expert