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
相关产品推荐
相关产品推荐

