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

SpringBoot JPA插入数据触发PostgreSQL category_id非空约束报错如何解决

报错根因

    1. 实体类主键字段配置了@GeneratedValue(strategy = GenerationType.IDENTITY),这个策略下Hibernate会认为主键值由数据库自增生成,插入数据时会主动忽略实体中携带的id值,不会将id字段加入插入SQL的字段列表中。
    1. 你的PostgreSQL的categories表只给category_id设置了主键非空约束,没有配置自增属性,数据库无法自动生成主键值,最终插入时出现category_id为null违反非空约束的报错。
  • 补充:你的请求参数中category_id能正确绑定到实体的id字段只是巧合,若后续调整序列化规则可能会出现绑定失败的问题,建议统一参数命名规则。

解决方案

场景1:希望用数据库自增生成主键(推荐,新增数据不需要前端传id)

  1. 先修改PostgreSQL表结构,给category_id字段添加自增属性,执行SQL:
ALTER TABLE categories 
ALTER COLUMN category_id ADD GENERATED ALWAYS AS IDENTITY;
-- 旧版本PostgreSQL可以用serial类型:
ALTER TABLE categories 
ALTER COLUMN category_id TYPE serial;
  1. 后续POST请求不需要传入category_id参数,请求体简化为{"category_name":"Food"}即可。

场景2:希望自己在请求里指定主键id值,不用数据库自增

  1. 删除实体类主键上的@GeneratedValue(strategy = GenerationType.IDENTITY)注解,这样Hibernate插入时会把你传入的id值写入SQL。
  2. 若需要请求体传category_id就能稳定绑定到实体的id字段,给id字段加@JsonProperty("category_id")注解,或者把字段名改成categoryId适配驼峰转下划线的默认序列化规则,保证参数绑定正确。

内容的提问来源于stack exchange,提问作者Yurii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:00:04