我是新來RequestFactory但隨着Thomas Broyer鼎力相助和審查它下面的文件後,是越來越好很多:)RequestFactory理論:爲什麼Locator <>。find()經常被調用?
但你能不能請解釋爲什麼Locator<>.find()
經常被不必要地調用(在我看來)?
在我的示例項目中,我有兩個實體Organization和Person來維護父子關係。當我取組織物化自動取孩子人。 此外,我在我的服務層findOrganizationById
和saveOrganization
中創建了兩種加載和保留對象的方法。
現在考慮兩種方案:
當我調用客戶端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)))
通過調用OrderDao.findOrganizationById
我已經收到對象的全圖。除此之外,爲什麼要撥打.find
兩次? 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)))
我可以理解需要之前取出由數據存儲兩個對象進行更新。 RequestFactory發送deltas給服務器,所以它在持久化之前需要擁有整個對象。仍然因爲我一次加載完整的圖表,它不會有第二個電話是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 2012-03-02 03:21:51