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 {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false, name="Id")
private BigInteger id;
@OneToOne
@JoinColumn(name = "table_b_id", referencedColumnName = "Id")