什么是同步2复杂对象图状态的最佳方法

时间:2009-11-17 05:52:22

标签: java .net web-applications

我有一个复杂的对象图来表示操作调度。 有一次,我必须将整个图表序列化到Web UI(通过XML / JSON),以便用户使用基于Javascript的甘特图组件修改计划。 用户完成编辑后,Java /服务器层中的图形状态必须与修改后的状态同步。

我想问一下实现复杂对象图的状态同步的最佳策略,例如:应该如何表示状态的变化,以便模拟服务器端的变化? 别人怎么会实现这个呢?

仅供参考,我目前的技术堆栈:JSF + Richfaces,Seam 2.1,Hibernate 3。 但我相信这个问题的解决方案也可以用于其他技术堆栈。

2 个答案:

答案 0 :(得分:4)

我建议避免同步两个图,但将编辑操作记录为“删除节点/插入节点/替换节点”操作。将此操作发送到服务器并将其应用于原始图表。

这个想法源于重写AST(抽象语法树)。在eclipse JDT you have an AST from your source。当应用重构(例如重命名方法)时,应该可以创建更改的预览。为此,重写事件(Delte / Insert / Replace)被记录并应用于AST的副本。从此生成预览。如果用户接受将事件应用于原始AST。

你的问题是这样的,你有两个开始相同的对象图,应该以相同的方式修改。这应该更容易实现为同步操作,您只需在用户修改图形时记录事件。

答案 1 :(得分:0)

我正在研究一个具有相同(正常?)问题的大型项目。设计人员基于DTO模式和CMP2实现了以下解决方案:

一般的想法是,每个表示图中对象的bean都可以记录自己的更改。因此,每个bean都有一个额外的结构(集合),其中只存储已更改的bean属性(值)的键(列名)。服务器逻辑使用这些提示来更新存储的数据。服务器逻辑可以使用这些提示仅更新更改。

(简化!)bean本身看起来有点像这样:

public TableBean {

  private String column1;

  // ... more fields

  private Set<String> changes = new Set<String>();

  public String getColumn1() {
    return column1;
  }

  public void setColumn1(String value) {
    if (!value.equals(column1)) {
      changes.add("column1");
      column1 = value;
    }
  }

  public Collection<String> getChanges() {
    return changes;
  } 
}

相应地处理子关系,还有另一个记录那些必须删除的子图的结构。

这甚至可能是标准的j2ee模式,请在这种情况下发表评论。

(除此之外,我赞成Arne的新设计解决方案!)