Hibernate: MyInterceptor # onFlushDirty никогда не вызывается
Вопрос: Почему MyInterceptor#onFlushDirty
никогда не называется?
Я расширяю AbstractEntityManagerFactoryBean
в xml-конфигурациях, например
MyEntityManagerFactoryBean
- Идея избежать этого spring.handlers / spring.schemas будет перезаписана при слиянии нескольких весенних зависимостей в одной банке
- Spring Java Config vs Jboss 7
- как получить параметр в методе post spring mvc?
- Конфигурирование ObjectMapper весной
- Перечисление карты в JPA с фиксированными значениями?
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(); } .... }
- Как я могу отключить пулы исполнителей / планировщиков Spring Spring до того, как все остальные бобы в веб-приложении будут уничтожены?
- Spring MVC - HttpMediaTypeNotAcceptableException
- Несколько примечаний с пружиной @RequestMapping
- Spring HandlerInterceptor vs Servlet Filters
- Соответствующий шаблон является строгим, но для контекста элемента не найдено объявления: компонент-сканирование
- Разница между примечанием @Controller от источника и @RestController
- Являются ли Spring MVC Controllers Singletons?
- Как работает автомастер весной?
Вам нужно расширить метод onFlushDirty
не onFlushDirty
. Проверьте это руководство для подробного объяснения со ссылкой на рабочий пример GitHub.