#java #spring #hibernate #interceptor
#java #spring #переход в спящий режим #перехватчик
Вопрос:
Я пишу библиотеку с spring boot, и мне нужно программно вставить перехватчик гибернации через нее (потому что я не могу использовать .properties
в библиотеке).).
Я хочу избежать предоставления своего собственного sessionFactory
компонента, я думаю, было бы неплохо оставить эту возможность для реализующего проекта, также избавляет меня от ручного сканирования объектов.
Моя глупая идея заключалась в том, что я мог бы «внедрить» свой перехватчик в JpaProperties
. Это вообще не сработало, он запустил @PostConstruct
, но ничего не изменилось. У меня было ощущение, что это не сработает, но я хотел бы понять, почему и как я могу заставить это работать.
@Autowired private JpaProperties properties;
@Autowired private MyInterceptor myInterceptor; //yep a bean
@PostConstruct public void add() {
((Map) properties.getProperties())
.put(
"hibernate.session_factory.interceptor",
myInterceptor
);
}
Ответ №1:
Поскольку при этом используется @PostConstruct
аннотация, добавление к JpaProperties
произойдет только после того, как EntityManagerFactoryBuilder
будет создано в JpaBaseConfiguration
. Это означает, что изменения в карте свойств не будут присутствовать в сборщике после этого момента.
Чтобы настроить JpaProperties
, вы должны создать экземпляр компонента, который добавляет вашу конфигурацию, например:
@Primary
@Bean
public JpaProperties jpaProperties() {
JpaProperties properties = new JpaProperties();
properties.getProperties().put("hibernate.session_factory.interceptor", myInterceptor);
return properties;
}
Затем это будет введено в HibernateJpaConfiguration
и использовано при построении EntityManagerFactoryBuilder
.
Комментарии:
1. Предоставление моего собственного компонента не переопределит все конфигурации в файле .properties? Я намерен только переопределить
hibernate.session_factory.interceptor
.2. Создание вашего собственного объекта jpaProperties не переопределит значения конфигурации в файле .properties или других источниках свойств. Когда объект jpaProperties настроен,
@ConfigurationProperties(prefix = "spring.jpa")
аннотация на объекте приводит к тому, что любое свойство с ключом, таким какspring.jpa.properties.hibernate.jdbc.fetch_size
, вставляется в карту свойств безspring.jpa.properties
префикса.3. тогда это решает 2-дневную головную боль … спасибо!