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
相关产品推荐
相关产品推荐

