我有一个CellTable<UserProxy>
. 所以换句话说,它直接管理我的数据库实体的实体代理。有了它,我使用了一个AsyncDataProvider<UserProxy>
使用请求工厂获取数据的方法。我的列的单元格是EditTextCell
. 我添加了一个FieldUpdater<UserProxy, String>
来编辑值。除了这里是我的问题:如果我更新实体的值并立即保存它工作正常,但我不知道如何将保存与稍后单击按钮不同。
基本上,我想实现 Apply-changes 模式(参见: http: //patterns.holehan.org/Review/ApplyChanges),所以我希望用户能够编辑表中的几个值,一旦他完成了他可以单击“应用”按钮,这将保存所有更改。
所以我的想法是在不调用保存的情况下更改代理实体中的值,然后将所有修改后的实体保存在按钮的点击处理程序中。
但要更改代理实体中的值,我必须先调用 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
如何避免这种情况而不必创建另一个代表同一实体的类?