#java #spring-boot #hibernate-envers #audit-logging
#java #весенняя загрузка #hibernate-envers #аудит-ведение журнала
Вопрос:
В hibernate envers я могу получить все изменения, внесенные в объект, используя следующий фрагмент кода:
AuditQuery aq = auditReader.createQuery().forRevisionsOfEntityWithChanges(DummyEntity.class, false);
Но есть ли способ получить все изменения, внесенные конкретным пользователем для всех объектов?
Я использую следующий объект для хранения информации о ревизии:
@RevisionEntity(UserRevisionListener.class)
@Entity(name = "env_audit_envers_info")
public class AuditEnversInfo extends DefaultRevisionEntity {
private static final long serialVersionUID = -7604731515258123883L;
@Column(name = "user_id")
private String userId;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
}
И записи в эту модель будут добавляться при каждом изменении с использованием следующего прослушивателя:
public class UserRevisionListener implements RevisionListener {
@Override
public void newRevision(Object revisionEntity) {
AuditEnversInfo auditEnversInfo = (AuditEnversInfo) revisionEntity;
Optional<Authentication> auth = Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication());
String username = auth.isPresent() ? auth.get().getName() : "anonymoususer@email.com";
auditEnversInfo.setUserId(username);
}
}
Ответ №1:
AuditEntity#revisionProperty
Метод — это то, что вы ищете:
List results = auditReader.createQuery()
.forRevisionsOfEntityWithChanges( DummyEntity.class, false )
.add( AuditEntity.revisionProperty( "userId" ).eq( userId ) )
.getResultList();
#revisionProperty
Методы были добавлены, чтобы позволить пользователям, которые расширяют или используют пользовательские экземпляры объектов ревизии в своей модели предметной области аудита, иметь возможность добавлять ограничения / прогнозы или иметь возможность сортировать результаты на основе полей в этой модели.
Комментарии:
1. Идеально! Спасибо 🙂