1

我有一个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

如何避免这种情况而不必创建另一个代表同一实体的类?

4

1 回答 1

1

您必须使用所有代理的单个RequestContext实例。edit()您可以edit()多次使用相同的代理,而不会出现错误和开销。

所以:

  1. 存储presenter.getClientFactory().getRequestFactory().getUserrequest()在某个变量/字段中
  2. FieldUpdaters 中,会将;ctx.edit(object).setName(value)中的更改排入队列 RequestContext可能也放UserProxy一个以Set供以后参考
  3. in saveModifications,遍历您的代理(可能只有那些来自Set步骤 2 的代理)ctx.save(item),然后在循环结束时ctx.fire()
于 2012-10-22T09:57:41.103 回答