Как вы упомянули, 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;
}
Поскольку это удобно и сохраняет добавление отступа. Кроме того, аккумулятор концептуально принадлежит циклу, итак, почему бы не поместить его там?