java - 如何仅更新字段的子集并更新存储库?
问题描述
我正在制作一个 Spring Boot 应用程序,并且希望通过我的服务和控制器更新数据库中的现有条目。在我的服务层中,我有以下方法。所以我正在检索与 caseID 关联的字段,创建一个模型映射器,将我的实体对象类映射到我的 VO,然后将检索到的数据映射到我的 DTO。然后我保存我的存储库。目的是仅添加我在 req 消息中指定的字段,即如果我只想更新 20 个字段中的 1 个字段,它会更新该字段并保持其余字段不变。以下运行成功,但我在邮递员的请求消息中指定的字段未在数据库中更新。为什么是这样?我尝试映射不同的对象并将不同的变量保存到存储库,但似乎没有任何东西可以更新数据库。
public StoredOutboundErrorCaseVO updateCase(OutboundErrorCaseVO outboundErrorCaseVO, Long caseNumber) {
OutboundErrorCaseData existingCaseData = ErrorCaseDataRepository.findById(caseNumber).get();
ModelMapper mm = new ModelMapper();
mm.getConfiguration().setAmbiguityIgnored(true);
OutboundErrorCaseData uiOutboundErrorCaseData = mm.map(outboundErrorCaseVO,
OutboundErrorCaseData.class);
mm.map(existingCaseData, uiOutboundErrorCaseData);
ErrorCaseDataRepository.save(uiOutboundErrorCaseData);
return mm.map(uiOutboundErrorCaseData, StoredOutboundErrorCaseVO.class);
}
控制器 - 为简洁起见省略代码,POST 方法(我通常使用 PUT 进行更新,但我相信我仍然可以使用 POST)
StoredOutboundErrorCaseVO updatedCase = outboundErrorService.updateCase(outboundErrorCaseVO,
caseNumber);
回购
@Repository
public interface OutboundErrorCaseDataRepository extends JpaRepository<OutboundErrorCaseData, Long> {
解决方案
您正在获取数据并将其传递到existingCaseData
并保存uiOutboundErrorCaseData
。所以我的猜测是 Hibernate 正在向数据库中添加一个具有新 ID 和更新值的新对象。这当然取决于您的模型定义。特别是id
。
如果您在 Hibernate Session 中已经有一个与该 ID 关联的对象,我还认为 Hibernate 不会让您uiOutboundErrorCaseData
使用相同的 ID 保存。那么,为什么不existingCaseData
使用新值进行更新并将其保存回来。
推荐阅读
- javascript - 当设备之间的纪元时间略有不同时,如何同步两个计时器(客户端/服务器)?
- java - 具有空值的 JTable 整数单元格编辑器
- php - 为什么 exec() 默默地丢弃字节?
- java - 尝试从不同类调用函数时应用程序崩溃
- javascript - React - 节流/去抖动微调器(加载消息) - 不显示请求是否快于 X 毫秒
- ruby-on-rails - Ruby on Rails:无法激活 tmail
- sql - SQL UPDATE 语句以随机顺序在多行之间切换值
- tensorflow - 如何将 Graph Transform Tool 与通过估算器 API 导出的已保存模型一起使用
- excel - 在 Excel VBA 中指示一组函数调用已完成
- javascript - 让 React 组件知道它们是从哪里导入的