Spring JPA插入关联中间表时Books、Students主表字段为null问题
问题原因
- 中间表级联配置错误
IssuedBooks实体类中对Books和Students的@ManyToOne注解配置了cascade = CascadeType.ALL,该配置会让保存IssuedBooks对象时,同步触发关联的Books、Students实体的所有持久化操作,包含更新操作。 - 入参对象字段缺失
你调用插入接口时传入的Books、Students对象大概率只有bookId、studentId两个主键字段有值,其余业务字段均为空。触发级联更新时,JPA会用这个字段不全的对象覆盖数据库中已有的主表记录,最终导致原有字段被置为null。
解决方案
- 移除错误的级联配置
删除IssuedBooks类中两个@ManyToOne注解的cascade = CascadeType.ALL属性。因为插入借书记录时不需要级联修改书籍、学生主表的原有数据,主表数据本身是提前独立维护的,不需要通过中间表操作变更。
修改后配置参考:
@ManyToOne(fetch = FetchType.EAGER) @MapsId("bookId") @JoinColumn(name = "bookId") private Books books; @ManyToOne(fetch = FetchType.EAGER) @MapsId("studentId") @JoinColumn(name = "studentId") private Students students;
- 调整插入业务逻辑
保存IssuedBooks前,先根据前端传入的bookId、studentId分别从数据库查询出完整的Books、Students持久化对象,再将这两个查询得到的对象赋值给IssuedBooks后执行保存,不要直接使用前端传入的缺字段对象直接赋值。
额外优化建议
Books和Students实体类上的@Component注解属于冗余配置,实体类不需要交给Spring容器管理,可以直接删除,不影响现有功能。
内容的提问来源于stack exchange,提问作者Manoj Piyumal
相关产品推荐
相关产品推荐

