Spring Boot更新Store记录时新增新id_store而非修改原有记录该如何解决
问题根因
Spring Data JPA 根据实体主键是否有值判断执行插入还是更新操作。你提交的更新表单未传递主键字段idStore,后端@ModelAttribute绑定得到的StoreModel对象主键为null,因此JPA将其识别为新实体,执行插入逻辑生成新的id_store。
修复步骤
1. 前端表单新增主键隐藏域
在form-update-store的表单内部添加隐藏域,传递待更新门店的主键值:
<form th:action="@{/store/update}" th:object="${store}" method="POST"> <!-- 新增以下隐藏字段 --> <input type="hidden" th:field="*{idStore}" /> <!-- 原有表单字段保持不变 --> </form>
th:field="*{idStore}"会自动读取你存入Model的原有store对象的主键值,随表单一起提交到后端。
2. 补充实体类缺失字段
你贴出的StoreModel实体类中未定义namaStore、addressStore两个和表单对应的字段,请先补全字段及对应的getter、setter方法,否则这两个字段的更新值无法正确绑定到实体对象。
3. (可选)优化后端更新逻辑
建议不要直接保存前端传入的StoreModel对象,避免前端恶意传递非法字段篡改数据,可参考以下逻辑实现更新:
// StoreService层updateStore方法示例 @Transactional public void updateStore(StoreModel formStore) { // 先查询数据库中已存在的持久化实体 StoreModel existStore = getStoreByidStore(formStore.getIdStore()); // 手动覆盖允许更新的字段 existStore.setNamaStore(formStore.getNamaStore()); existStore.setAddressStore(formStore.getAddressStore()); existStore.setWaktuBuka(formStore.getWaktuBuka()); existStore.setWaktuTutup(formStore.getWaktuTutup()); existStore.setKodeStore(formStore.getKodeStore()); existStore.setManager(formStore.getManager()); // 保存更新后的实体 storeRepository.save(existStore); }
内容的提问来源于stack exchange,提问作者jacob
相关产品推荐
相关产品推荐

