Hibernate: MyInterceptor # onFlushDirty никогда не вызывается

Вопрос: Почему MyInterceptor#onFlushDirty никогда не называется?

Я расширяю AbstractEntityManagerFactoryBean в xml-конфигурациях, например

       

MyEntityManagerFactoryBean

 public class MyEntityManagerFactoryBean extends AbstractEntityManagerFactoryBean implements LoadTimeWeaverAware { private Interceptor entityInterceptor; public Interceptor getEntityInterceptor() { return entityInterceptor; } public void setEntityInterceptor(Interceptor interceptor) { entityInterceptor = interceptor; } } 

MyInterceptor:

 public class MyInterceptor extends EmptyInterceptor { public MyInterceptor() { System.out.println("init"); // Works well } // PROBLEM - is never called @Override public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) { if (entity instanceof File) { ..... } return false; } } 

ОБНОВЛЕНИЕ: [объяснение, почему обычная грязная политика выглядит не так)

Я хочу обновлять modified метку времени каждый раз, когда я что-то меняю в объекте Folder EXCEPT folderPosition . В то же время folderPosition должно быть постоянным, а не временным (означает, что сущность объекта грязная).

Поскольку я использую шаблоны Spring Transactional и Hibernate, есть некоторые нюансы:

1) Я не могу обновить измененную метку времени в конце каждого сеттера, например:

 public void setXXX(XXX xxx) { //PROBLEM: Hibernate templates collect object via setters, //means simple get query will cause multiple 'modified' timestamp updates this.xxx = xxx; this.modified = new Date(); } 

2) Я не могу вызвать setModified вручную, потому что у него около 25 полей, а setXXX для каждого поля разбросано по всему приложению. И у меня нет полномочий делать рефакторинг.

 @Entity public class Folder { /** * GOAL: Changing of each of these fields except 'folderPosition' should cause * 'modified' timestamp update */ private long id; private String name; private Date created; private Date modified; private Integer folderLocation; @PreUpdate public void preUpdate() { //PROBLEM : change modified even if only location field has been changed! //PROBLEM: need to know which fields have been updated! modified = new Date(); } .... } 

Вам нужно расширить метод onFlushDirty не onFlushDirty . Проверьте это руководство для подробного объяснения со ссылкой на рабочий пример GitHub.

  • Как найти все controllerы в Spring MVC?
  • Как создать пользовательский идентификатор, используя hibernate, в то время как он должен быть первичным ключом таблицы
  • Если вы настроили свойства подключения к базе данных в файле server.xml или context.xml
  • Использование запроса Hibernate: двоеточие обрабатывается как параметр / экранирование двоеточия
  • Как вы глобально настроили jacksonа игнорировать неизвестные свойства в течение весны?
  • Не удалось инициализировать прокси - нет сеанса
  • Транзакция, отмеченная только как откат: как мне найти причину
  • Как запустить приложение Spring-Boot без зависимости от базы данных?
  • Аутентифицированная среда равна нулю
  • Тип безопасности: непроверенный литой
  • Spring Data + JPA с несколькими источниками данных, но только один набор репозиториев
  • Давайте будем гением компьютера.