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

为什么Spring Data JPA插入首字母大写的表会自动转小写报错?

问题根因

出现表名自动转小写报错的原因有两点:

  1. Hibernate默认命名策略问题:Spring Boot 2.x集成Hibernate默认使用SpringPhysicalNamingStrategy作为物理命名策略,该策略会自动将@Table注解中指定的表名转换为全小写的蛇形命名,你配置的Example会被自动转为example。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:06:03