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

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);
    }
}

三、关键说明

  1. 双向关联维护:JPA不会自动同步双向关联的两端,必须手动为每个Bill设置User,否则bill表中的user_id外键会为null。
  2. 级联操作:@OneToMany的cascade = CascadeType.ALL配置,确保保存User时,关联的Bill会被自动持久化到数据库。
  3. 字段映射匹配:通过@JsonProperty("mobile")解决请求参数mobile与实体类mobileno的字段名不一致问题,也可以直接将实体类字段名改为mobile。
  4. 孤儿删除(可选):orphanRemoval = true配置,当从User的bills列表中移除账单时,数据库中对应的账单记录会被自动删除,适合主从关联场景。

四、Postman请求注意事项

  • 请求方式:POST
  • 请求URL:http://localhost:8080/api/bill
  • 请求体:保持你提供的JSON内容不变
  • 请求头:设置Content-Type: application/json

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:56:07