如何在“SpringDataJPA”中使用java代码设置默认实体侦听器?
我可以设置默认实体侦听器使用如何在“SpringDataJPA”中使用java代码设置默认实体侦听器?,java,spring,hibernate,spring-data-jpa,Java,Spring,Hibernate,Spring Data Jpa,我可以设置默认实体侦听器使用persistence.xml 如何在spring数据jpa中设置默认实体侦听器使用java代码 我想动态设置实体侦听器,hibernate.session\u factory.interceptor 我在hibernate或spring数据jpa文档中没有找到这一点 您可以自定义LocalContainerEntityManagerFactoryBean的定义,将其指向您的自定义persistence.xml。在Spring Boot中,快速而肮脏的方法是创建一个
persistence.xml
如何在
spring数据jpa
中设置默认实体侦听器使用java代码
我想动态设置实体侦听器,
hibernate.session\u factory.interceptor
我在hibernate或spring数据jpa文档中没有找到这一点
您可以自定义
LocalContainerEntityManagerFactoryBean
的定义,将其指向您的自定义persistence.xml
。在Spring Boot中,快速而肮脏的方法是创建一个BeanPostProcessor
:
@Component
public class PersistenceXmlPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
if (bean instanceof LocalContainerEntityManagerFactoryBean && runtimeConditionMet()) {
((LocalContainerEntityManagerFactoryBean) bean).setPersistenceXmlLocation(<your custom persistence.xml location>)
}
return bean;
}
}
(一个更干净的解决方案可能是扩展
EntityManagerFactoryBuilder
,但我希望您能了解大概的想法)。除了@EntityListeners,因为没有设置动态您尝试过spring.jpa.properties.hibernate.session\u factory.interceptor
?您可以通过将属性放在单独的配置文件中使其成为动态的。另请参见hibernate.session\u factory.interceptor
设置为interceptor,但我想设置侦听器
@Component
public class PersistenceXmlPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
if (bean instanceof LocalContainerEntityManagerFactoryBean && runtimeConditionMet()) {
((LocalContainerEntityManagerFactoryBean) bean).setPersistenceXmlLocation(<your custom persistence.xml location>)
}
return bean;
}
}
@SpringBootApplication(exclude = HibernateJpaAutoConfiguration.class)
public class MyApplication {
...
}
@Configuration
public class CustomHibernateJpaConfiguration extends JpaBaseConfiguration {
...// copy most methods over from HibernateJpaConfiguration
@Override
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder factoryBuilder) {
var result = super.entityManagerFactory(factoryBuilder);
result.setPersistenceXmlLocation(...);
return result;
}
}