1

私は持っていCellTable<UserProxy>ます。つまり、データベースエンティティのエンティティプロキシを直接管理します。それでAsyncDataProvider<UserProxy>、リクエストファクトリを使用してデータをフェッチするを使用します。私の列のセルはEditTextCellです。そしてFieldUpdater<UserProxy, String>、値を編集するためにを追加しました。ここを除いて、私の問題があります。エンティティの値を更新してすぐに保存すると、正常に機能しますが、後でボタンをクリックするだけで保存を変更する方法がわかりません。

基本的に、Apply-changesパターン(http://patterns.holehan.org/Review/ApplyChangesを参照)を実装したいので、ユーザーがテーブル内のいくつかの値を編集できるようにし、完了したらユーザーが編集できるようにします。すべての変更を保存する[適用]ボタンをクリックできます。

したがって、これについての私の考えは、saveを呼び出さずにプロキシエンティティの値を変更し、変更されたすべてのエンティティをボタンのクリックハンドラに保存することでした。

ただし、プロキシエンティティの値を変更するには、最初に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. saveModifications、プロキシ (おそらくSetステップ 2 で構築されたもののみ) をctx.save(item)ループし、ループの最後でループします。ctx.fire()
于 2012-10-22T09:57:41.103 に答える