我有一个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  
如何避免这种情况而不必创建另一个代表同一实体的类?