Теория RequestFactory: Почему так часто вызывается Locator <>. Find ()?

Я новичок в 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 clazz)
    {
        try
        {
            return clazz.newInstance();
        } catch (InstantiationException e)
        {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e)
        {
            throw new RuntimeException(e);
        }
    }

    @Override
    public DatastoreObject find(Class 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();
    }
}

8
задан Community 23 May 2017 в 10:34
поделиться