Я новичок в RequestFactory, но с щедрой помощью Томаса Бройера и после просмотра документов, приведенных ниже, ситуация стала намного лучше :)
Но не могли бы вы объяснить, почему Locator . Find ()
вызывается так излишне (на мой взгляд) часто?
В моем примере проекта у меня есть две сущности Организация и Лицо, поддерживающее родительско-дочерние отношения. Когда я получаю Organization Objectify , автоматически выбирает дочерний объект 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
? Мне дорого обходится дополнительная нагрузка на хранилище данных. Я, конечно, кеширую, но поправить было бы неплохо. Как я могу избежать этих дополнительных вызовов?
Аналогичная вещь происходит, когда я сохраняю объект (ы), вызывая 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 отправляет дельты на сервер, поэтому он должен иметь весь объект перед его сохранением.Тем не менее, поскольку я загружаю сразу полный график, было бы неплохо, чтобы не было второго вызова 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 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 saveOrganization(OrganizationProxy organization);
Request findOrganizationById(long id);
}
OrderRequestContext contextOrder();
}
и, наконец, мой Локатор
public class PojoLocator extends Locator
{
@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 key = Key.create(id);
DatastoreObject load = ofy.load(key);
return load;
}
@Override
public Class getDomainType()
{
return null; // Never called
}
@Override
public String getId(DatastoreObject domainObject)
{
Key key = ofy.fact().getKey(domainObject);
return key.getString();
}
@Override
public Class getIdType()
{
return String.class;
}
@Override
public Object getVersion(DatastoreObject domainObject)
{
return domainObject.getVersion();
}
}