我有CellTable<UserProxy>
。换句话说,它直接管理我的数据库实体的实体代理。有了它,我使用AsyncDataProvider<UserProxy>
使用请求工厂获取数据。
我的列的单元格是EditTextCell
。我添加了FieldUpdater<UserProxy, String>
来编辑值。除了这里是我的问题:如果我更新实体的值并立即保存它可以正常工作,但我不知道如何将保存与以后点击按钮区别开来。
基本上,我想实现Apply-changes模式(参见:http://patterns.holehan.org/Review/ApplyChanges),所以我希望用户能够在表中编辑多个值,一旦完成,他可以点击'apply '按钮将保存所有更改。
所以我的想法是更改代理实体中的值而不调用save,然后在按钮的clickhandler中保存所有已修改的实体。
但要更改代理实体中的值,我必须先调用ctx.edit(user):
nameColumn.setFieldUpdater(new FieldUpdater<UserProxy, String>() {
@Override
public void update(int index, UserProxy object, String value) {
if (!value.equals(object.getName())) {
UserRequest ur = presenter.getClientFactory().getRequestFactory().getUserRequest();
ur.edit(object);
object.setName(value);
saveButton.setEnabled(true);
}
}
});
这使得以后无法在应用按钮的点击处理器中保存它们:
private void saveModifications() {
List<UserProxy> items = cellTable.getVisibleItems();
for (UserProxy item : items) {
UserRequest ur = presenter.getClientFactory().getRequestFactory().getUserRequest();
ur.save(item).fire();
}
cellTable.setVisibleRangeAndClearData(cellTable.getVisibleRange(), true);
}
因为调用save(item)
会引发此异常:java.lang.IllegalArgumentException: Attempting to edit an EntityProxy previously edited by another RequestContext
如何避免这种情况而又不必再创建另一个代表同一实体的类?
答案 0 :(得分:1)
您必须使用单个RequestContext
实例edit()
所有代理。您可以edit()
多次使用相同的代理,没有错误,也没有开销。
所以:
presenter.getClientFactory().getRequestFactory().getUserrequest()
存储在某个地方的变量/字段中FieldUpdater
s中ctx.edit(object).setName(value)
会将RequestContext
中的更改排入队列;可能会将UserProxy
放在Set
中以供日后参考saveModifications
中,遍历您的代理(可能只有来自Set
基于步骤2构建的代理)和ctx.save(item)
,然后循环结束ctx.fire()
< / LI>
醇>