Программно добавляем перехватчик гибернации в JpaProperties - Spring - PullRequest
1 голос
/ 04 апреля 2019

Я пишу библиотеку с пружинной загрузкой, и мне нужно программно вставить через нее перехватчик гибернации (потому что я не могу использовать .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 Ответ

1 голос
/ 04 апреля 2019

Поскольку используется аннотация @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.

...