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

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

火山引擎 最新活动