实体快照
实体快照保存机制,以及 实体日志 功能,用来在运行时跟踪数据的变化。主要功能如下:
-
保存通过特定 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 还包含了用户、日期和时间。当从列表中选定某个快照时,会展示该版本与前一个快照版本的不同。第一个快照的所有属性都会标记为已改动。选择两个快照可以在表格中看到对比结果。
对比表格中展示属性名称以及属性的新值。当选中某一行时,会展示两个快照之间的属性变化详情。引用字段会使用 实例名称 进行展示。当对集合进行比较时,新增和删除的元素会分别使用绿色和红色进行高亮标注。仅修改了属性值的集合元素不会高亮标注。元素位置的变化不会做记录。