2017-02-22 10 views
1

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

@Audited(withModifiedFlag = true) 

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

UPDATE Я заметил, что в классе org.hibernate.envers.event.EnversPostUpdateEventListenerImpl, когда следующий объект конкретизируется

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

event.getOldState() имеет нулевое значение, но ИМО это должно быть не нулевым. Вот почему Envers каждый раз добавляет новую ревизию.

ответ

1

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

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

Смежные вопросы