为什么Spring Data JPA插入首字母大写的表会自动转小写报错?
问题根因
出现表名自动转小写报错的原因有两点:
- Hibernate默认命名策略问题:Spring Boot 2.x集成Hibernate默认使用
SpringPhysicalNamingStrategy作为物理命名策略,该策略会自动将@Table注解中指定的表名转换为全小写的蛇形命名,你配置的Example会被自动转为example。 - PostgreSQL标识符规则问题:PostgreSQL默认对SQL中未加双引号的标识符做自动小写转换,你建表时使用了带双引号的
"Example"写法,生成的是大小写敏感的大写表名,而Hibernate生成的SQL中表名未加双引号,被数据库转为小写example后和实际表名不匹配,因此抛出表不存在的错误。
解决方案
你可以根据项目情况选择以下任意一种方案解决:
方案1:全局配置适配大小写敏感表
如果项目中存在多个大小写敏感的表/字段,建议直接在application.properties中添加以下配置,一次修改全局生效:
# 保留@Table、@Column注解中定义的名称大小写,不做自动转换 spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl # 生成SQL时自动给所有标识符加双引号,适配PostgreSQL大小写敏感规则 spring.jpa.properties.hibernate.globally_quoted_identifiers=true
方案2:单独为当前实体配置大小写匹配
如果只有少量表是大小写敏感的,不需要全局修改,可以直接修改实体类的@Table注解,手动转义双引号即可:
@Entity @Table(name = "\"Example\"") // 转义双引号让Hibernate生成SQL时自带双引号,匹配大写表名 @Data public class Example implements Serializable { // 注意:原有id字段定义为int类型,和表结构的bigint不匹配,建议修改为Long类型避免后续数值溢出 @Id @Column(name = "id") private Long id; // 其余代码保持不变 }
注意:如果选择全局配置方案,需要确保所有实体类的
@Table、@Column注解中填写的名称和数据库实际的表、字段名大小写完全一致,否则也会出现找不到资源的问题。
内容的提问来源于stack exchange,提问作者AndreaNobili
相关产品推荐
相关产品推荐

