- Audit表
Audit表是用来记录数据创建,修改,删除的历史记录表。
一条数据可能经历创建,修改,删除,每当这条数据经历其中的一个动作就会在相应的audit表中有一条记
录。
从表中的id可以看到,这个audit表只记录了两条数据的变动历史。id是对应于原来数据的id,的rev代表的是修改的版本号,revtype为0代表创建,1代表修改,2代表删除。删除后的数据相对应的audit表只有id,rev,revtype 这三个字段有值,其他字段的值会为空,因为这条数据已经删除。
- 查询
hibernate提供的AuditQuery这个接口来查询audit表,但是其查询能力有限,只能做一些简单的查询, 不能关联表做查询。未来的版本这个限制可能会得到改进。
如果要做复杂查询,建议直接使用sql通过spring提供的JdbcTemplate查询。
AuditQuery c = getAuditReader().
createQuery().
forRevisionsOfEntity(clazz , false, true);
c.add(AuditEntity.id().eq(page.getSf_EQ_id()));
c.add(AuditEntity.property("active").eq(true));
c.add(AuditEntity.revisionNumber().
eq(getRevisionNumber(id, clazz, Boolean.TRUE)));
c.add(AuditEntity.relatedId("groupType").eq(parentId));
c.add(AuditEntity.property("corporation").eq(corporation));
protected AuditReader getAuditReader() {
return AuditReaderFactory.get(getSession());
}
c.setFirstResult(0)
c.setMaxResults(10);
c.getResultList()
add (AuditCriterion criterion)是AuditQuery最重要的方法,用来添加限制条件。
AuditEntity这个接口是用来创建限制条件的。
当要创建的查询条件,关乎的属性是一个对象,但在这个查询类不能使用这个对象的类时(一般audit查询的DAO都在父工程中,父工程的类不能使用工程的类),就可以用relatedId(String propertyName)这个方法。
- 返回
AuditQuery c = getAuditReader().createQuery().forRevisionsOfEntity(clazz , false, true);
public AuditQuery forRevisionsOfEntity(Class<?> c, boolean selectEntitiesOnly, boolean selectDeletedEntities)
当selectEntitiesOnly为true时,查询结果返回的list的每个元素是实体对象。
当selectEntitiesOnly为false时,查询结果返回的list的每个元素是一个数组。每个数组包含三个对象。数组的第一个对象是实体对象,第二个元素是revision data对象(默认是DefaultRevisionEntity类型的实例包含版本信息id, 修改时间信息datetime),第三个对象是revision type对象(枚举提供的信息是修改类型,ADD-添加,MOD-修改,DEL-删除)
c.addProjection(AuditEntity.property("code"));
c.addProjection(AuditEntity.property("name"));
c.addProjection(AuditEntity.property("firstName"));
c.add(AuditEntity.id().eq(page.getSf_EQ_id()));
c.setFirstResult(page.getBeginIndex());
c.setMaxResults(page.getPageSize());
page.setObjResult(c.getResultList());
用addProjection()这个方法只返回某些特定的字段。这个查询将返回一个list,list中每个元素是一个数组,数组的第一个元素值是code,第二个是name,第三个是firstName。