Программное добавление перехватчика гибернации в jpaProperties — Spring

#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-дневную головную боль … спасибо!