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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:45:01