Spring Data JPA操作PostgreSQL报错:public.tableA关系不存在
问题解决方法
1. 开启JPA自动建表功能
默认情况下JPA不会自动创建数据库表,需要在application.properties中添加配置,让Hibernate自动生成或更新表结构:
spring.jpa.hibernate.ddl-auto=update
update:根据实体类自动更新表结构,保留现有数据create:每次启动重新创建表(会清空数据,适合测试环境)create-drop:启动时创建表,应用关闭时删除表
2. 解决PostgreSQL大小写敏感问题
PostgreSQL默认会把未加引号的SQL标识符转为小写,而你的实体类中@Table(name = "TableA")会让Hibernate生成带双引号的表名"TableA",如果数据库中不存在大小写完全匹配的表就会报错。
两种解决方式任选其一:
- 将实体类的表名改为小写:
@Table(name = "tablea") public class TableA { ... }@Table(name = "tableb") public class TableB { ... } - 或者显式配置Hibernate不使用引号包裹标识符(默认值为false,若之前被修改过需手动设置):
spring.jpa.properties.hibernate.globally_quoted_identifiers=false
3. 修复OneToOne映射错误
你的TableA中@OneToOne的@JoinColumn(name = "Id")和主键字段id同名,会导致外键与主键共用同一列,不符合关联逻辑,还会引发数据插入异常。
修改为单独的外键列:
@Entity @Table(name = "TableA") public class TableA { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(nullable = false, name="Id") private BigInteger id; @OneToOne @JoinColumn(name = "table_b_id", referencedColumnName = "Id") private TableB tableB; //Setters Getters }
4. 验证数据库权限
确认PostgreSQL中public schema存在,且当前数据库用户拥有该schema的读写权限。
内容的提问来源于stack exchange,提问作者TSSK





