Как отслеживать события удаления с помощью Spring Data JPA Auditing и Envers?

В моем проверенном объекте у меня есть поля:

@LastModifiedBy
private String lastModifiedBy;

@LastModifiedDate
private OffsetDateTime lastModifiedDate;

Но они не меняются при удалении объекта. Как я понимаю, мне нужно настроить org.springframework.data.jpa.domain.support.AuditingEntityListener и добавить туда @PreRemove, но я не понимаю, как это реализовать, потому что у меня всегда есть

org.hibernate.InstantiationException: Could not instantiate managed bean directly

Существуют ли другие варианты отслеживания событий удаления и сохранения обновленных полей в таблице аудита Envers?


person Igor    schedule 27.11.2019    source источник
comment
Я верю, что эти аннотации специфичны для spring-data-envers, поэтому, надеюсь, кто-то из этого сообщества может дать более развернутый ответ; однако, строго с точки зрения Энверса, все, что мы храним, — это текущее состояние сущности до удаления. Я считаю, что предложение с @PreRemove состоит в том, чтобы изменить текущее состояние объекта в памяти до прослушивателей событий для аудита. Тем не менее, Envers по умолчанию не хранит атрибуты непервичного ключа для удаленных строк. Существует параметр конфигурации org.hibernate.envers.store_data_at_delete, для которого необходимо установить значение true, чтобы выполнить это.   -  person Naros    schedule 27.11.2019
comment
@Naros, я опубликовал свой обходной путь, что вы думаете об этом?   -  person Igor    schedule 27.11.2019


Ответы (1)


сделал этот обходной путь:

public class CustomValidityAuditStrategy extends ValidityAuditStrategy {

private final AuditorAware<String> auditorAware = ...;

@Override
public void perform(final Session session, final String entityName, final AuditEntitiesConfiguration audEntitiesCfg, final Serializable id, final Object data, final Object revision) {
    if (data instanceof Map) {
        final Map dataToUpdate = (Map) data;
        dataToUpdate.put("lastModifiedBy", auditorAware.get());
        dataToUpdate.put("lastModifiedDate", OffsetDateTime.now());
    }
    super.perform(session, entityName, audEntitiesCfg, id, data, revision);
}

}

person Igor    schedule 27.11.2019
comment
Я считаю, что вы захотите выполнить это только тогда и только тогда, когда операция является DELETE. На данный момент это изменит значения этих двух атрибутов независимо от того, какую операцию DML вы выполняете, вставляете, обновляете или удаляете. Я думаю, что, вероятно, было бы лучше реализовать собственный PreDeleteEventListener, где вы берете состояние объекта и манипулируете им. Таким образом, вы гарантируете, что это работает только при операциях удаления. - person Naros; 02.12.2019