Spring Boot向PostgreSQL插入数据异常:仅自增ID生效其余字段为Null
解决POST请求插入PostgreSQL时仅ID字段赋值其他字段为Null的问题
核心原因
你的Question实体类仅添加了@AllArgsConstructor和@NoArgsConstructor Lombok注解,但未提供字段的getter/setter方法。Spring MVC通过@RequestBody解析JSON请求体时,无法为私有字段赋值,最终导致插入数据库时只有自动生成的ID有值,其余字段为Null。
解决方案
1. 为实体类添加Lombok的@Data注解
修改Question实体类,添加@Data注解,它会自动生成所有字段的getter、setter方法,以及toString、equals、hashCode等必要方法:
package com.infosys.entity; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Entity @Data @AllArgsConstructor @NoArgsConstructor @Table(name = "questions") public class Question { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "question_id") private Long questionId; @Column(name = "question") private String question; @Column(name = "quiz_id") private Long quizId; }
2. 匹配请求体字段与实体类属性名
确保Postman发送的JSON请求体字段名和实体类属性名完全一致,示例正确请求体:
{ "question": "测试问题内容", "quizId": 1 }
注:JPA会自动处理驼峰属性名到数据库下划线列名的转换,因此请求体用quizId对应数据库的quiz_id是正确的。
3. 修正application.properties配置冲突
配置中spring.jpa.hibernate.ddl-auto=none与spring.jpa.generate-ddl=true存在冲突,建议统一调整为:
spring.jpa.hibernate.ddl-auto=update spring.datasource.url=jdbc:postgresql://localhost:5432/micro_zt spring.datasource.username=postgres spring.datasource.password=password server.port = 8080
update模式会根据实体类自动同步数据库表结构,避免手动建表时的字段匹配问题。
4. 修正控制器方法权限
将控制器中create方法的private修饰符改为public,符合Spring MVC规范:
@PostMapping public Question create(@RequestBody Question question) { return qService.add(question); }
验证步骤
- 重启Spring Boot应用
- 在Postman中发送POST请求到
http://localhost:8080/question,携带正确JSON请求体 - 查询PostgreSQL的
questions表,确认所有字段已正确赋值
内容的提问来源于stack exchange,提问作者chinmay
相关产品推荐
相关产品推荐

