Все поля @Version в таблице AUD равны нулю при использовании hibernate-envers, но в сущности - таблица заполнена, окей?

он проверяет ссылку, если вы не перепутаете equals

10
задан Roberto 23 January 2019 в 10:11
поделиться

2 ответа

Посмотрите на настройку конфигурации org.hibernate.envers.do_not_audit_optimistic_locking_field.

Этот параметр конфигурации определяет, будет ли Hibernate Envers включать аннотированное поле @Version в схему аудита или нет. По умолчанию настройка установлена ​​на true, что означает, что поле оптимистической блокировки не будет проверяться. Установив значение false, вы будете проверять значение столбца.

Я хочу предупредить вас о настройке этого поля на false.

Если ваше приложение выполняет явную функцию приращения оптимистической блокировки, это приведет к добавлению дополнительных строк в таблицу истории аудита, даже если ни один из других столбцов базы данных не будет изменен как часть вашего бизнес-процесса. Это связано с тем, что после того, как вы включили отслеживание @Version полей, Hibernate Envers просто обрабатывает их как любой другой базовый атрибут объекта. Следовательно, принудительное приращение оптимистической блокировки приведет к изменению аудита.

0
ответ дан Naros 23 January 2019 в 10:11
поделиться

Как вы упомянули, 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;
}
0
ответ дан hovanessyan 23 January 2019 в 10:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: