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

JPA插入PostgreSQL报错:column p1_0.pet_id does not exist

解决JPA插入PostgreSQL时出现"column p1_0.pet_id does not exist"错误

问题根源

你遇到的错误核心是JPA生成的SQL列名与数据库实际列名不匹配:

  • PostgreSQL默认会将未加双引号的标识符(表名、列名)自动转换为小写,所以你的建表SQL里的petId、petType实际在数据库中是petid、pettype;
  • JPA默认命名策略会把实体类的驼峰字段(如petId)转换为下划线分隔形式(pet_id),导致执行SQL时找不到对应列。

解决方案

方案1:为实体类字段显式指定列名

在每个字段上添加@Column注解,对应数据库实际的小写列名:

@Entity
@Table(name = "pet", schema = "petsetgo")
public class Pet extends BaseModel implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "petid") // 对应数据库petid列
    private String petId;
    
    @Column(name = "name")
    private String name;
    
    @Enumerated(value = EnumType.STRING)
    @Column(name = "pettype") // 对应数据库pettype列
    private PetType petType;
    
    @Column(name = "age")
    private Integer age;
    
    @Column(name = "breedid") // 此处用@Column更合适,因为breedId是字符串而非实体关联
    private String breedId;
}

方案2:修改JPA命名策略

调整Hibernate命名策略,让它直接使用字段名(转小写),不做驼峰转下划线的转换。如果是Spring Boot项目,在配置文件中添加:
application.properties:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

application.yml:

spring:
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

该方案会影响所有实体类的命名,适合项目中数据库表列名均为小写的场景。

方案3:修改数据库表列名

将数据库列名改为JPA默认的下划线格式,实体类无需修改:

ALTER TABLE pet RENAME COLUMN petid TO pet_id;
ALTER TABLE pet RENAME COLUMN pettype TO pet_type;
ALTER TABLE pet RENAME COLUMN breedid TO breed_id;

注意:若表中已有数据,执行前请做好数据备份。

内容的提问来源于stack exchange,提问作者shix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:29:51