如何在“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;
    }

}