为了账号安全,请及时绑定邮箱和手机立即绑定

如何仅更新字段的子集并更新存储库?

如何仅更新字段的子集并更新存储库?

郎朗坤 2023-10-12 17:30:43
我正在制作一个 Spring Boot 应用程序,并且希望通过我的服务和控制器更新数据库中的现有条目。在我的服务层中,我有以下方法。因此,我检索与 caseID 关联的字段,创建一个模型映射器,将实体对象类映射到我的 VO,然后将检索到的数据映射到我的 DTO。然后我保存我的存储库。目的是仅添加我在请求消息中指定的字段,即如果我只想更新 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);回购协议    @Repositorypublic interface OutboundErrorCaseDataRepository extends JpaRepository<OutboundErrorCaseData, Long> {
查看完整描述

2 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

您正在获取数据并将其传递到existingCaseData并保存uiOutboundErrorCaseData。所以我的猜测是 Hibernate 正在使用新的 Id 和更新的值将一个新对象添加到数据库中。这当然取决于您的模型定义。尤其是id

我还认为,如果 Hibernate Session 中已经有一个与该 id 关联的对象,Hibernate 不会让您uiOutboundErrorCaseData使用相同的 id 进行保存。那么,为什么不existingCaseData使用新值进行更新并将其保存回来。


查看完整回答
反对 回复 2023-10-12
?
守着一只汪

TA贡献1872条经验 获得超3个赞

我创建了一个可行的解决方案,尽管我意识到它可以改进,但它确实有效。唯一的缺点是我需要指定所有可以更新的字段,理想情况下我想要一个包含 n 个字段并更新记录的解决方案。


OutboundErrorCaseData existingCaseDta = ErrorCaseDataRepository.findById(caseNumber).get();

    if (outboundErrorCaseVO.getChannel() != null) {

        existingCaseDta.setChannel(outboundErrorCaseVO.getChannel());

    }

ErrorCaseDataRepository.save(existingCaseDta);

    ModelMapper mm = new ModelMapper();

    return mm.map(existingCaseDta, StoredOutboundErrorCaseVO.class);


查看完整回答
反对 回复 2023-10-12
  • 2 回答
  • 0 关注
  • 93 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信