Spring Boot3+Java17开发时PostgreSQL报id字段非空约束错误
问题原因分析
JPA的UUID生成逻辑不作用于原生SQL插入:你通过
@GeneratedValue(strategy = GenerationType.UUID)配置的ID生成规则,是由JPA实现(如Hibernate)在调用EntityManager持久化实体对象时自动生成UUID并填充的。但直接执行原生SQL插入语句时,JPA不会参与操作,数据库本身没有自动生成UUID的机制,导致ID字段为空,触发非空约束报错。自动创建的表未配置数据库级ID默认值:JPA自动建表时,仅会将
id字段标记为非空主键,但不会为其设置数据库层面的默认值(比如PostgreSQL的uuid_generate_v4())。因此手动执行SQL插入时,必须显式提供ID值,否则数据库会将ID设为null。
可选解决方向
- 手动插入时显式指定UUID值:
insert into companies(id, icon, name) values ('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', 'icon.png', 'UPV')
- 修改表结构添加数据库级ID默认值:
先启用PostgreSQL的uuid扩展(首次执行):
再设置ID字段默认值:CREATE EXTENSION IF NOT EXISTS "uuid-ossp";ALTER TABLE companies ALTER COLUMN id SET DEFAULT uuid_generate_v4();
内容的提问来源于stack exchange,提问作者victorsan
相关产品推荐
相关产品推荐

