Spring Boot:无需声明FMModel,单save方法同步双表数据问题求助
解决方案
1. 先搞定表单绑定的报错
你遇到的Neither BindingResult nor plain target object for bean name 'fetchFMModel' available错误,本质是Spring MVC找不到名为fetchFMModel的请求属性——说明你页面表单里直接引用了这个对象,而不是通过CensusModel的关联属性来绑定字段。
修正方法:
- 页面表单要以
CensusModel的关联属性为前缀绑定FM的字段。比如用Thymeleaf的话,表单要绑定到censusModel对象,FM的字段要嵌套在它的集合属性里:<form th:object="${censusModel}" th:action="@{/submit}" method="post"> <!-- 用户表字段 --> <input type="text" th:field="*{username}" placeholder="用户名"/> <!-- 一对多场景下,循环绑定FM表的字段 --> <div th:each="fm, stat : *{fmModels}"> <input type="text" th:field="*{fmModels[__${stat.index}__].fmField1}" placeholder="FM字段1"/> <input type="text" th:field="*{fmModels[__${stat.index}__].fmField2}" placeholder="FM字段2"/> </div> <button type="submit">提交</button> </form> - 跳转表单页面时,控制器里要初始化
CensusModel和它的FM集合,不然页面绑定会空指针:@GetMapping("/form") public String showForm(Model model) { CensusModel census = new CensusModel(); // 先初始化集合,还可以加个空的FM对象,方便用户输入 census.setFmModels(new ArrayList<>()); census.getFmModels().add(new FMModel()); model.addAttribute("censusModel", census); return "form-page"; }
2. 把JPA关联配置改对,不然级联保存不生效
你已经加了CascadeType.ALL,但大概率是双向关联没维护好,导致FM表数据存不进去。
正确配置:
- **CensusModel(test_user)**的一对多注解要指定维护端是FMModel,同时加级联和孤儿移除:
@Entity @Table(name = "test_user") public class CensusModel { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; // mappedBy指定FMModel里的census字段是关联维护端 @OneToMany(mappedBy = "census", cascade = CascadeType.ALL, orphanRemoval = true) private List<FMModel> fmModels = new ArrayList<>(); // 加个方法来维护双向关联,避免手动设置出错 public void addFm(FMModel fm) { fmModels.add(fm); fm.setCensus(this); // 关键:必须把FM的census指向当前用户对象 } // getter、setter自行补全 } - **FMModel(test_fm)**的多对一注解要指定外键字段:
@Entity @Table(name = "test_fm") public class FMModel { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String fmField1; private String fmField2; // 外键对应test_fm表的census_id列,nullable=false确保关联有效 @ManyToOne @JoinColumn(name = "census_id", nullable = false) private CensusModel census; // getter、setter自行补全 }
3. 控制器提交时要维护关联关系
表单提交后,Spring MVC会把数据绑定到CensusModel里,但FM对象的census属性是空的——这时候直接save的话,JPA不会认这个关联,自然不会存FM表。
提交方法示例:
@PostMapping("/submit") public String submit(@ModelAttribute("censusModel") CensusModel census, BindingResult result) { if (result.hasErrors()) { return "form-page"; } // 遍历所有FM对象,设置关联关系 for (FMModel fm : census.getFmModels()) { fm.setCensus(census); // 或者调用上面的addFm方法:census.addFm(fm); } // 只调用CensusRepository的save,级联保存两张表 censusRepository.save(census); return "success"; }
最后排查几个坑
- 检查表单提交的参数名:必须是
fmModels[0].fmField1这种格式,要是写成fetchFMModel.fmField1肯定报错,因为控制器里没把这个对象放到Model里。 - 数据库外键:test_fm的
census_id字段要确保和test_user的id字段类型匹配,而且如果设置了非空,就不能让它为空,不然插入会失败。 - 级联配置:确认
CascadeType.ALL包含了PERSIST操作(默认是包含的),这样save用户的时候才会自动保存关联的FM数据。
内容的提问来源于stack exchange,提问作者sttipid
相关产品推荐
相关产品推荐

