SpringBoot JPA插入数据触发PostgreSQL category_id非空约束报错如何解决
报错根因
- 实体类主键字段配置了
@GeneratedValue(strategy = GenerationType.IDENTITY),这个策略下Hibernate会认为主键值由数据库自增生成,插入数据时会主动忽略实体中携带的id值,不会将id字段加入插入SQL的字段列表中。
- 实体类主键字段配置了
- 你的PostgreSQL的
categories表只给category_id设置了主键非空约束,没有配置自增属性,数据库无法自动生成主键值,最终插入时出现category_id为null违反非空约束的报错。
- 你的PostgreSQL的
- 补充:你的请求参数中
category_id能正确绑定到实体的id字段只是巧合,若后续调整序列化规则可能会出现绑定失败的问题,建议统一参数命名规则。
解决方案
场景1:希望用数据库自增生成主键(推荐,新增数据不需要前端传id)
- 先修改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;
- 后续POST请求不需要传入
category_id参数,请求体简化为{"category_name":"Food"}即可。
场景2:希望自己在请求里指定主键id值,不用数据库自增
- 删除实体类主键上的
@GeneratedValue(strategy = GenerationType.IDENTITY)注解,这样Hibernate插入时会把你传入的id值写入SQL。 - 若需要请求体传
category_id就能稳定绑定到实体的id字段,给id字段加@JsonProperty("category_id")注解,或者把字段名改成categoryId适配驼峰转下划线的默认序列化规则,保证参数绑定正确。
内容的提问来源于stack exchange,提问作者Yurii
相关产品推荐
相关产品推荐

