Spring Boot 3.2.4配置Hibernate下划线命名策略失效求助
解决Hibernate驼峰命名转数据库下划线列名失效问题
问题原因
你使用了自定义的EntityManagerFactory配置类(GeneralDBConfig),此时Spring Boot自动配置的JPA命名策略属性(spring.jpa.hibernate.naming.*)不会被自动注入到自定义的EntityManagerFactory中,必须手动在配置代码里指定命名策略参数。
解决方案
在GeneralDBConfig的generalEntityManagerFactory方法中,将命名策略配置添加到Hibernate属性Map里,替换掉原来注释的代码块:
修改后的代码片段
@Primary @Bean(name = "generalEntityManagerFactory") public LocalContainerEntityManagerFactoryBean generalEntityManagerFactory(final EntityManagerFactoryBuilder builder, final @Qualifier("generalDB") DataSource dataSource, final @Value("${spring.datasource.general.hibernate.hbm2ddl.auto}") String hibernateHbm2dllAuto, final @Value("${spring.datasource.general.database-platform}") String databasePlatform) { Map<String, Object> props = new HashMap<>(); // 添加命名策略配置 props.put("hibernate.physical_naming_strategy", org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy.class.getName()); props.put("hibernate.implicit_naming_strategy", org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy.class.getName()); if (StringUtils.isNotBlank(hibernateHbm2dllAuto)) { props.put("hibernate.hbm2ddl.auto", hibernateHbm2dllAuto); } if (StringUtils.isNotBlank(databasePlatform)) { props.put("hibernate.dialect", databasePlatform); } return builder .dataSource(dataSource) .packages("com.swisscom.wholesale.portal.domain.general") .persistenceUnit("generalDB") .properties(props) .build(); }
补充说明
CamelCaseToUnderscoresNamingStrategy是Hibernate原生的驼峰转下划线策略,会将translationKey转换为translation_key。- 如果偏好Spring Boot提供的命名策略,可以替换为
org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy,它在Hibernate原生策略基础上做了适配,行为基本一致。 - 确保你的实体类(包括继承的
AbstractProductEntity)被正确扫描到(packages("com.swisscom.wholesale.portal.domain.general")已经覆盖)。
内容的提问来源于stack exchange,提问作者StefanoSKAL
相关产品推荐
相关产品推荐

