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

Spring Data JPA使用IDENTITY主键策略插入数据报id非空约束错误

问题根因

GenerationType.IDENTITY策略依赖数据库层面的主键自增属性实现自动主键生成,你遇到的报错是因为Product表的id主键没有配置自增属性。

对比你提供的两张表建表SQL就能发现差异:

  • Category表的id字段配置了序列作为默认值:id bigint NOT NULL DEFAULT nextval('category_id_seq'::regclass),等价于自增主键,插入数据时数据库会自动生成id值,所以IDENTITY策略可以正常生效
  • Product表的id字段仅配置了非空约束:id bigint NOT NULL,没有自增属性,使用IDENTITY策略时Hibernate会默认主键由数据库生成,不会主动给id赋值,插入时id为null就触发了非空约束报错。

为什么后续新增@GeneratedValue注解不生效

JPA默认不会修改已存在的表结构:你最初创建Product表时,实体类仅配置了@Id注解没有主键生成策略,JPA生成表时就不会给id加自增属性;后续你补上@GeneratedValue(strategy = GenerationType.IDENTITY)注解后,JPA不会主动更新已有的Product表结构,因此问题一直存在。

解决方案

你可以选择任意一种方式修复:

  • 生产环境:手动修改Product表结构,给id字段加上自增属性,执行SQL:
ALTER TABLE public.product ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY;

你也可以手动给id绑定序列,和Category表的配置对齐即可。

  • 开发环境:直接删除已有的Product表,重启项目后JPA会根据最新的实体注解自动生成带自增属性的表结构。

内容的提问来源于stack exchange,提问作者dev-marko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:36:02