我正在用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
时使用。