Spring Boot JPA+Lombok:OneToMany/ManyToOne关联的Postman数据保存
解决实体类关联映射与数据保存问题
一、修正实体类的关联映射与字段匹配
首先需要修正User类中的关联配置和字段映射问题,确保和请求参数匹配:
修正后的User实体
@NoArgsConstructor @AllArgsConstructor @Data @Entity public class User{ @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; private String name; // 匹配Postman请求中的"mobile"字段 @JsonProperty("mobile") private String mobileno; private String role; // 修正mappedBy为Bill类中的user属性,属性名改为bills匹配请求参数 @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List<Bill> bills; }
优化后的Bill实体(可选但推荐)
添加@JoinColumn明确外键列名,增强数据库表结构可读性:
@NoArgsConstructor @AllArgsConstructor @Data @Entity public class Bill{ @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; private String billno; private Integer amount; private Integer qtyinbill; // 指定外键列名为user_id @ManyToOne @JoinColumn(name = "user_id") private User user; }
二、完善Controller的保存逻辑
双向关联关系需要手动维护,确保每个Bill都关联到当前User,否则数据库中外键会为空。结合JPA的级联保存特性完成数据持久化:
@RestController @RequestMapping("/api") public class BillController { private final UserRepository userRepository; // 构造注入(Spring官方推荐方式) public BillController(UserRepository userRepository) { this.userRepository = userRepository; } @PostMapping("/bill") public ResponseEntity<User> saveBill(@RequestBody User user) { // 维护双向关联:为每个账单设置所属用户 if (user.getBills() != null && !user.getBills().isEmpty()) { user.getBills().forEach(bill -> bill.setUser(user)); } // 级联保存用户及关联的账单 User savedUser = userRepository.save(user); return ResponseEntity.ok(savedUser); } }
三、关键说明
- 双向关联维护:JPA不会自动同步双向关联的两端,必须手动为每个
Bill设置User,否则bill表中的user_id外键会为null。 - 级联操作:
@OneToMany的cascade = CascadeType.ALL配置,确保保存User时,关联的Bill会被自动持久化到数据库。 - 字段映射匹配:通过
@JsonProperty("mobile")解决请求参数mobile与实体类mobileno的字段名不一致问题,也可以直接将实体类字段名改为mobile。 - 孤儿删除(可选):
orphanRemoval = true配置,当从User的bills列表中移除账单时,数据库中对应的账单记录会被自动删除,适合主从关联场景。
四、Postman请求注意事项
- 请求方式:POST
- 请求URL:
http://localhost:8080/api/bill - 请求体:保持你提供的JSON内容不变
- 请求头:设置
Content-Type: application/json
内容的提问来源于stack exchange,提问作者ASIF KAIF
相关产品推荐
相关产品推荐

