Получить оригинальный объект перед обновлением в слушателях сущности hibernate - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь реализовать сущность, которая сравнивает исходный и обновленный объекты в событии @PreUpdate. Я попытался использовать репозиторий Jpa для запроса исходного объекта по идентификатору из БД, чтобы сравнить его с объектом, полученным в событии. Но он получает тот же объект (я думаю, он возвращает объект, присутствующий в области видимости сеанса).

Есть ли способ получить исходный объект из базы данных в прослушивателе сущностей?

1 Ответ

0 голосов
/ 19 октября 2019

JPA не предоставляет старого и нового состояния в EntityListener.

Но вы можете использовать перехватчики Hibernates:

public static class LoggingInterceptor extends EmptyInterceptor {
    @Override
    public boolean onFlushDirty(
        Object entity,
        Serializable id,
        Object[] currentState,
        Object[] previousState,
        String[] propertyNames,
        Type[] types) {
            LOGGER.debugv( "Entity {0}#{1} changed from {2} to {3}",
                entity.getClass().getSimpleName(),
                id,
                Arrays.toString( previousState ),
                Arrays.toString( currentState )
            );
            return super.onFlushDirty( entity, id, currentState,
                previousState, propertyNames, types
        );
    }
}

В этом примере вы видите, что вы текущий ипредыдущее состояние в виде массивов, которые можно легко сравнить.

Пожалуйста, прочитайте документы: https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#events

...