实体快照

实体快照保存机制,以及 实体日志 功能,用来在运行时跟踪数据的变化。主要功能如下:

  • 保存通过特定 Fetch plan 定义的实体关系图的完整状态(即,快照)。

  • 应用程序代码会显式调用快照保存机制。

  • 框架支持查看和比较实体快照。

保存快照

如需保存给定实体关系图的快照,需要手动调用 EntitySnapshotManager.createSnapshot() 方法,并传递两个参数,一个是实体关系图的入口实体,还有一个是描述关系图的 fetchPlan。框架会使用加载后的实体创建快照,因此不会有数据库开销,从而在加载实体时没有包含在 fetch plan 中的字段也不会包含在快照中。

Java 对象关系图会转换成 XML 保存在 AUDIT_ENTITY_SNAPSHOT 数据库表中(对应 EntitySnapshot 实体),同时也保存一份主实体的链接。

通常,在编辑 界面 提交之后需要保存快照。可以创建界面控制器的 AfterCommitChangesEvent 监听器实现,示例:

@Autowired
protected EntitySnapshotManager entitySnapshotManager;

@Subscribe
protected void onAfterCommitChanges(AfterCommitChangesEvent event) {
    entitySnapshotManager.createSnapshot(getEditedEntity(),
            getEditedEntityContainer().getFetchPlan());
}

查看快照

需要查看任何实体的快照,可以使用 snapshotDiff fragment。示例:

<fragment id="snapshotDiff"
          width="100%"
          height="100%"
          screen="snapshotDiff"/>

需要在界面控制器为 fragment 加载快照:

@Autowired
protected EntityStates entityStates;

@Autowired
protected SnapshotDiffViewer snapshotDiff;

@Subscribe
protected void onBeforeShow(BeforeShowEvent event) {
    if (!entityStates.isNew(getEditedEntity())) {
        snapshotDiff.loadVersions(getEditedEntity());
    }
}

snapshotDiff fragment 能展示给定实体的快照列表,并可以对快照进行对比。每个快照的 fetchPlan 还包含了用户、日期和时间。当从列表中选定某个快照时,会展示该版本与前一个快照版本的不同。第一个快照的所有属性都会标记为已改动。选择两个快照可以在表格中看到对比结果。

对比表格中展示属性名称以及属性的新值。当选中某一行时,会展示两个快照之间的属性变化详情。引用字段会使用 实例名称 进行展示。当对集合进行比较时,新增和删除的元素会分别使用绿色和红色进行高亮标注。仅修改了属性值的集合元素不会高亮标注。元素位置的变化不会做记录。