SpringBoot自定义EntityManager驼峰转下划线失效、不读取yml配置如何解决
问题根源
手动构建LocalContainerEntityManagerFactoryBean时,未注入SpringBoot自动装配的JPA全局配置、Hibernate属性与默认命名策略,因此会出现配置文件参数不生效、命名规则不符合默认逻辑的问题。
修复方案
直接复用SpringBoot自动加载的JPA配置Bean构建实例,即可保证和默认EntityManager的行为完全一致,具体步骤如下:
- 在配置类中注入
JpaProperties、HibernateProperties两个内置Bean,二者会自动读取application.yml中spring.jpa前缀下的所有配置项 - 构建EntityManagerFactory时,通过
HibernateProperties的内置方法合并默认配置属性,传入构建器即可
修正后完整配置代码
@Slf4j @RequiredArgsConstructor @EnableJpaAuditing @EnableJpaRepositories(basePackages = "com.xxx.yyy", entityManagerFactoryRef = "businessEntityManagerFactory", transactionManagerRef = "businessTransactionManager") @EntityScan(basePackages = "com.xxx.yyy") @Configuration public class JpaConfiguration { private final JpaProperties jpaProperties; private final HibernateProperties hibernateProperties; @Bean public LocalContainerEntityManagerFactoryBean businessEntityManagerFactory(EntityManagerFactoryBuilder builder, DataSource businessDataSource) { Map<String, Object> vendorProps = hibernateProperties.determineHibernateProperties( jpaProperties.getProperties(), new HibernateSettings() ); return builder .dataSource(businessDataSource) .packages("com.xxx.yyy") .properties(vendorProps) .build(); } @Bean public PlatformTransactionManager businessTransactionManager(LocalContainerEntityManagerFactoryBean businessEntityManagerFactory) { return new JpaTransactionManager(Objects.requireNonNull(businessEntityManagerFactory.getObject())); } }
配置说明
- 上述配置会自动加载
application.yml中所有JPA相关配置,包括spring.jpa.show-sql、spring.jpa.hibernate.ddl-auto等参数,无需手动逐一声明 - 配置默认会启用SpringBoot内置的
SpringPhysicalNamingStrategy,自动将实体类的驼峰属性名转换为下划线格式的数据库字段名,和默认EntityManager的命名规则完全一致 - 配置第二个数据源的EntityManager时,按照相同逻辑注入对应DataSource、设置独立的包扫描路径即可,两个数据源的JPA配置可独立维护也可复用全局配置
若需要指定某一个数据源为主数据源,在对应EntityManagerFactory、TransactionManager的@Bean注解上添加
@Primary注解即可,使用体验和单数据源场景无差异
内容的提问来源于stack exchange,提问作者genki98
相关产品推荐
相关产品推荐

