Envers 4.2.x добавляет запись в таблицу AUD, даже если нет изменений

Я использую Hibernate Envers 4.2.21.FINAL. Поскольку я хочу отслеживать изменения только некоторых свойств, я добавил аннотацию

@Audited(withModifiedFlag = true)

на них. Столбец флага "propname_MOD" создан правильно, но проблема в том, что когда я сохраняю объект, все флаги MOD устанавливаются в true, а не только для атрибута, который я изменил. кто-нибудь знает, как решить эту проблему?

ОБНОВЛЕНИЕ Я заметил, что в классе org.hibernate.envers.event.EnversPostUpdateEventListenerImplкогда создается следующий объект

AuditWorkUnit workUnit = new ModWorkUnit(
    event.getSession(),event.getPersister().getEntityName(),getAuditConfiguration(),
    event.getId(),event.getPersister(),newDbState,event.getOldState() );

event.getOldState() является нулевым, но IMO должно быть не нулевым. Вот почему Энверс каждый раз добавляет новую ревизию.

1 ответ

Решение

Проблема была на самом деле связана с event.getOldState() являющийся null,

Это было связано с saveOrUpdate метод Hibernate, который воспринимает сущность из JSF как обособленную. Я сейчас пользуюсь merge вместо saveOrUpdate и Envers правильно сохраняет поля _MOD в true или false.

Другие вопросы по тегам