You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 11:15:41