即使只更改了一个元素</entity proxy>,请求工厂也会发送回整个List <entity proxy>

时间:2012-01-31 04:43:10

标签: gwt collections requestfactory

当我加载具有嵌套的实体代理集合的实体代理(例如:包含联系代理列表的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 个答案:

答案 0 :(得分:3)

您正在将列表从10个元素的列表修改为9个元素的列表,因此RF会发送9个元素的新列表(并将在服务器端调用带有新列表的setter)。

但是,它只发送联系人的ID,而不是他们的属性,因为那些没有改变(是的,这意味着必须在服务器端检索所有联系人,以便填充新的列表在将其设置到地址簿中之前,有9个元素。)

虽然RF可能还有改进空间:当你edit()代理时,它会自动编辑它引用的所有代理(递归),因此所有10个联系人都被edit()编辑,因此全部10个联系人ID被发送到服务器,从数据库中检索所有10个联系人并进行验证,即使之后只使用其中的9个。因此,如果删除联系人自最初在客户端上检索后已更新,则服务器将发送 {{{ 1}}用于响应中与客户端的联系。

简而言之:没有魔力,一切都需要付出代价,所以在设计“API”时要小心;您可能希望向EntityProxyChange添加removeContact方法,而不是修改列表(并在同一RequestContext中再次检索地址簿 - 以获取客户端的更新 - 侧)