он проверяет ссылку, если вы не перепутаете equals
Посмотрите на настройку конфигурации org.hibernate.envers.do_not_audit_optimistic_locking_field
.
Этот параметр конфигурации определяет, будет ли Hibernate Envers включать аннотированное поле @Version
в схему аудита или нет. По умолчанию настройка установлена на true
, что означает, что поле оптимистической блокировки не будет проверяться. Установив значение false
, вы будете проверять значение столбца.
Я хочу предупредить вас о настройке этого поля на false
.
Если ваше приложение выполняет явную функцию приращения оптимистической блокировки, это приведет к добавлению дополнительных строк в таблицу истории аудита, даже если ни один из других столбцов базы данных не будет изменен как часть вашего бизнес-процесса. Это связано с тем, что после того, как вы включили отслеживание @Version
полей, Hibernate Envers просто обрабатывает их как любой другой базовый атрибут объекта. Следовательно, принудительное приращение оптимистической блокировки приведет к изменению аудита.
Как вы упомянули, 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;
}