Фабрика запросов отправляет обратно весь список <EntityProxy>, даже если изменен только один элемент - PullRequest
1 голос
/ 31 января 2012

Когда я загружаю прокси-сервер сущностей, который имеет вложенную коллекцию прокси-серверов сущностей (например, прокси-сервер сущностей AddressBook, содержащий список прокси-серверов контактов), и если я изменяю внутренний список (список контактов), как удаление элемента, и вызвать постоянную на нем, фабрика запросов отправляет весь список контактов.Это ожидаемое поведение, или он должен отправлять только команду для удаления элемента на сервере?

Вопрос в том, отправляет ли фабрика запросов дельты только для изменений на уровне поля, или вычисляет дельтытакже для коллекций?

ContactProxy

interface ContactProxy extends EntityProxy {

    ...

    //Getters and setters for firstName, lastName, phoneNumber etc...

    ...
}

AddressBookProxy

interface AddressBookProxy extends EntityProxy {

      ...

      List<ContactProxy> getContacts();
      void setContacts(List<ContactProxy> contacts);   

      ...

}

Код фокуса:

//Assume I received an abProxy from a previous context.

AddressBookRequestContext context = requestFactory.requestContext();

abProxy = context.edit(abProxy);

abProxy.getContacts().remove(0);

context.persist().using(abProxy).fire();

Приведенный выше фрагмент кода отправляетВесь список контактов получен в предыдущем контексте, но я ожидал отправить только команду удаления на сервер.Я что-то не так делаю?

Теперь, когда я изменяю один контакт в прокси-сервере сущности AddressBook и выполняю вызов для сохранения, он все равно отправляет весь список контактов.Какой обходной путь должен заставить дельты работать при такого рода изменениях уровня сбора.

1 Ответ

3 голосов
/ 31 января 2012

Вы изменяете список из списка из 10 элементов в список из 9 элементов, поэтому RF отправляет новый список из 9 элементов (и вызывает установщик с новым списком на стороне сервера).

Однако он отправляет только идентификаторы контактов, а не их свойства, потому что они не изменились (и да, это означает, что все контакты должны быть получены на стороне сервера, чтобы заполнить новый списокиз 9 элементов, прежде чем устанавливать его в адресную книгу).

Возможно, в RF есть место для улучшения: когда вы edit() прокси, он автоматически редактирует все прокси, на которые ссылается (рекурсивно), поэтому все10 контактов edit() ed, и, таким образом, все 10 идентификаторов контактов отправляются на сервер, все 10 контактов извлекаются из базы данных и проверяются, хотя впоследствии только 9 из них используются.В результате (и это можно рассматривать как функцию) в случае, если контакт удален был обновлен с момента первоначального получения на клиенте, сервер отправит EntityProxyChange дляконтакт с клиентом в ответе.

В двух словах: волшебства нет, все обходится дорого, поэтому будьте осторожны при разработке своих «API»;Возможно, вы захотите добавить removeContact метод к вашему RequestContext вместо изменения списка (и снова получить адресную книгу - упакованную в том же RequestContext - чтобы получить обновление на стороне клиента)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...