我正在用spring boot编写一个库,我需要以编程方式通过它插入一个休眠拦截器(因为我不能在lib中使用.properties)。

我想避免提供自己的sessionFactory bean,我认为最好将这种可能性留给正在实施的项目,同时也可以避免手动扫描实体。

我愚蠢的想法是我可以将拦截器“注入”到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
            );
}

最佳答案

由于这使用的是@PostConstruct注释,因此,仅在JpaProperties中创建了EntityManagerFactoryBuilder之后,才会添加JpaBaseConfiguration。这意味着在此之后,对属性映射的更改将不会出现在构建器中。

要定制JpaProperties,您应该实例化一个将配置添加到其中的bean,例如:

    @Primary
    @Bean
    public JpaProperties jpaProperties() {
        JpaProperties properties = new JpaProperties();
        properties.getProperties().put("hibernate.session_factory.interceptor", myInterceptor);
        return properties;
    }


然后将其注入HibernateJpaConfiguration并在构造EntityManagerFactoryBuilder时使用。

10-08 00:38