如何解决如何在`spring-data-jpa`中使用java代码设置默认实体侦听器?
我可以使用 persistence.xml
设置默认实体侦听器。
如何在 spring-data-jpa
中使用 java 代码设置默认实体侦听器?
我想动态设置实体监听器,hibernate.session_factory.interceptor
我在 hibernate 或 spring-data-jpa 文档中没有找到这个。
<entity-mappings xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm
http://xmlns.jcp.org/xml/ns/persistence/orm_2_1.xsd"
version="2.1">
<persistence-unit-metadata>
<persistence-unit-defaults>
<entity-listeners>
<entity-listener
class="com.miya.system.listener.BackupDataListener">
<post-remove method-name="postRemove" />
</entity-listener>
</entity-listeners>
</persistence-unit-defaults>
</persistence-unit-metadata>
</entity-mappings>
解决方法
您可以自定义 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;
}
}
作为替代方案,您可以使用 BaseJpaAutoConfiguration
自定义实体管理器工厂:
@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;
}
}
(更简洁的解决方案可能是扩展 EntityManagerFactoryBuilder
,但我希望您能大致了解)。