【问题标题】:How to undo RequestFactory update如何撤消 RequestFactory 更新
【发布时间】:2012-02-15 02:48:46
【问题描述】:

通过 GWT RPC 更新对象可以很容易地撤消。我们需要在内存中克隆先前的实体状态并在撤消时应用它。

但是当我们使用 RequestFactory 时并没有具体的更新操作。 RequestFactory 将实体修改发送到服务器并更新存储库实体本身。我们无法拦截更新过程。

我应该如何为使用 RequestFactory 所做的更新实现撤消?

【问题讨论】:

  • 您是在使用 InstanceRequest 还是仅在 RF 中使用 Request 来调用持久性?

标签: gwt undo requestfactory


【解决方案1】:

您应该考虑修改服务器端数据结构和表。在那里合并一个时间或双时间模型。不要费心试图在内存中保存实体的“旧”状态,或者拦截它们。使用时间字段保持实体的先前状态不变。撤消意味着通过时间戳定位先前的版本,并使其成为当前版本。您也可以同时跨多个实体类型执行此操作。

  • 01:00 披萨 A 保存
  • 01:01 比萨 A 的配料发生变化
  • 01:02 比萨 A 的成分发生了变化
  • 01:03 撤消到 01:01

如果您愿意,您可以定期扫描您的数据库并清理旧版本。临时写入的“仅追加”样式也可以带来性能优势。

【讨论】:

    【解决方案2】:

    在您触发请求之前,请求工厂不会更新服务器实体。因此,您可以简单地避免调用 fire(),以防止对服务器进行修改。希望这就是你的意思。您能否发布代码来演示您更新实体的方式以及您希望在何处执行撤消操作?

    【讨论】:

    • “撤消”表示服务器上的修改已经完成。我需要拦截服务器更新操作以保存实体状态以供将来撤消。
    【解决方案3】:

    我不知道你是否愿意这样做。为此,假设您想撤消一个类的更改,例如 Contact,添加一个相同类型的字段,类似于以前的状态(如果您不希望它弄乱您的持久性,只需将其设置为瞬态),以便类看起来像这样:

    class Contact {
    
        Integer id;
        Integer version;
    
        String name;
        String phoneNumber;
    
        //Transient
        Contact previousState;
    
    }
    

    现在在您的persist 调用中,将当前数据备份到previousState 中,然后保留当前的Contact 实体。在撤消调用中,将数据从 previousState 复制到“this”。

    撤消在服务器上没有任何意义,这些事情必须在客户端上进行管理。我没有遇到任何需要在服务器上执行撤消功能的情况。因此,请引用您希望完成此操作的场景和代码。

    【讨论】:

    • 要仅在客户端上执行撤消,您应该将所有应用程序状态保留在客户端上。您认为在 GWT 应用程序中可能吗?
    • 确实是这样,但您不需要整个应用程序状态,像地址簿应用程序中的联系人实体这样的实体是您对“撤消”感兴趣的对象吗?
    • 没有。你错了。例如,考虑一个有序的联系人列表。
    猜你喜欢
    • 2023-03-05
    • 2018-03-16
    • 2015-03-13
    • 1970-01-01
    • 2011-09-10
    • 2011-01-11
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多