当我加载具有嵌套的实体代理集合的实体代理(例如:包含联系代理列表的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实体代理中的单个联系人进行更改并进行持久调用时,它仍然会发送整个联系人列表。获取增量工作以进行这些集合级别更改的解决方法是什么。
答案 0 :(得分:3)
您正在将列表从10个元素的列表修改为9个元素的列表,因此RF会发送9个元素的新列表(并将在服务器端调用带有新列表的setter)。
但是,它只发送联系人的ID,而不是他们的属性,因为那些没有改变(是的,这意味着必须在服务器端检索所有联系人,以便填充新的列表在将其设置到地址簿中之前,有9个元素。)
虽然RF可能还有改进空间:当你edit()
代理时,它会自动编辑它引用的所有代理(递归),因此所有10个联系人都被edit()
编辑,因此全部10个联系人ID被发送到服务器,从数据库中检索所有10个联系人并进行验证,即使之后只使用其中的9个。因此,如果删除联系人自最初在客户端上检索后已更新,则服务器将发送 {{{ 1}}用于响应中与客户端的联系。
简而言之:没有魔力,一切都需要付出代价,所以在设计“API”时要小心;您可能希望向EntityProxyChange
添加removeContact
方法,而不是修改列表(并在同一RequestContext
中再次检索地址簿 - 以获取客户端的更新 - 侧)