Hibernate未按默认命名策略映射驼峰字段为下划线列名问题
你手动声明LocalContainerEntityManagerFactoryBean自定义JPA配置时,Spring Boot自动装配默认带的命名策略不会自动注入。当前配置里没有显式指定Hibernate的物理/隐式命名策略,Hibernate会退回原生默认策略,直接用实体字段原名作为列名,自然不会执行驼峰转下划线的映射。
你代码里虽然导入了SpringPhysicalNamingStrategy类,但根本没有把它配置到Hibernate的生效属性中。
另外你当前配置里的sai.jpa.hibernate.ddl-auto=none是无效配置——你自定义的EntityManager读取的是sai.datasource.jpa前缀下的参数,不是sai.jpa前缀,这条配置根本不会被加载。
只要把Spring提供的命名策略配置到JPA属性中即可,两种方式二选一:
方法1:代码中直接配置
修改返回JPA属性的properties()方法,直接把命名策略参数写入Map:
@Bean("jpaPropertyMap") @ConfigurationProperties(prefix = "sai.datasource.jpa") @NonNull public Map<String, String> properties() { Map<String, String> jpaProps = new HashMap<>(); // 配置驼峰转下划线的命名策略 jpaProps.put("hibernate.physical_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy"); jpaProps.put("hibernate.implicit_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy"); return jpaProps; }
方法2:配置文件注入
因为你给properties()方法加了@ConfigurationProperties(prefix = "sai.datasource.jpa")注解,可以直接在application.properties里加配置,参数会自动绑定到属性Map中:
# 修正原配置里前缀写错的ddl-auto sai.datasource.jpa.hibernate.ddl-auto=none # 新增命名策略配置 sai.datasource.jpa.hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy sai.datasource.jpa.hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
只要你手动定义了LocalContainerEntityManagerFactoryBean,Spring Boot JPA的默认自动配置就会失效,所有默认JPA参数都需要手动显式配置,不会自动继承Spring Boot的默认值。SpringPhysicalNamingStrategy就是Spring Boot默认的驼峰转下划线策略,配置后不仅字段名,表名也会自动按驼峰转下划线规则映射。
内容的提问来源于stack exchange,提问作者Bablu

