2 回答

TA贡献1835条经验 获得超7个赞
看配置设置org.hibernate.envers.do_not_audit_optimistic_locking_field
。
此配置设置控制 Hibernate Envers 是否将@Version
在审计模式中包含带注释的字段。默认情况下,该设置设置为true
这意味着不会审核乐观锁定字段。通过将此设置为false
,您将审核列的值。
我确实想提醒您将此字段设置为false
.
如果您的应用程序执行显式乐观锁定增量功能,这将导致将额外的行添加到审计历史表中,即使在您的业务流程中没有更改任何其他数据库列。这是因为一旦启用@Version
要跟踪的字段,Hibernate Envers 就会简单地将它们视为实体上的任何其他基本属性。因此,强制乐观锁增量将触发审计更改。

TA贡献1815条经验 获得超10个赞
正如您所提到的 - REVINFO 是所有被审计实体的集中表。
下面介绍的基本思想是将修订号重新映射到整数序列 - 因此 RevNumber(2,5,31,125) 将重新映射到 customVersion(1,2,3,4)
假设您有EntityA并且您想要为其获取所有版本(并将每个版本数据映射到自定义类RevisionEntityDto)。
使用AuditReader来自 Envers,您可以执行以下操作:
AuditReader auditReader = AuditReaderFactory.get(entityManager);
//getRevisions() returns revisions sorted in ascending order (older revisions come first)
List<Number> entityARevisions = auditReader.getRevisions(EntityA.class, primaryKeyOfEntityA);
//entityARevisions is already sorted;
for (int customVersion = 0; customVersion < entityARevisions.size(); customVersion++) {
createRevisionEntityDto(primaryKeyOfEntityA, auditReader, revision, customVersion);
}
private RevisionEntityDto createRevisionEntityDto(Long primaryKeyOfEntityA, AuditReader, Number revision) {
EntityA revisionOfEntityA = auditReader.find(EntityA.class, primaryKey, revision);
Date revDate = auditReader.getRevisionDate(revision);
// at this point you have a single revision of EntityA
return toRevisionEntityDto(revision, revisionOfEntityA, revDate);
}
private RevisionEntityDto toRevisionEntityDto(Number revision, EntityA revisionOfEntityA, Date revisionDate, int customVersion) {
//here you do the mapping logic;
RevisionEntityDto revEntityDto = new RevisionEntityDto();
revEntityDto.setFieldA(revisionOfEntityA.getFieldA);
revEntityDto.setDate(revisionDate); // you can use the date to sort if you want at a later stage;
revEntityDto.setCustomVersion(customVersion);
return revEntityDto;
}
添加回答
举报