为什么JPA Repository保存方法不更新生产中的实体详细信息



我正在使用spring数据JPA,我正在尝试使用JPARepository方法save((更新实体详细信息。我为更新实体而编写的代码在开发中运行良好,正如预期的那样。但是相同的代码在生产服务器上不起作用——它不会给出任何错误——只有在map((中编写的代码不起作用。下面是我的代码

public Long updateQrCodeUrlByBusinessDetails(Long businessId, String menuUrl, MENU_TYPE menuType) {
return qrCodeRepo.findByBusinessId(businessId).businessQrCode.stream().map(qr -> {
qr.setMenuUrl(menuUrl);
qr.setMenuType(menuType);
return qrCodeRepo.save(qr);
}).count();
}

问题是count

如果能够直接从流源计算计数,则可以选择不执行流管道(顺序或并行(。在这种情况下,不会遍历任何源元素,也不会评估任何中间操作。除了调试等无害情况外,强烈建议使用具有副作用的行为参数,这些参数可能会影响

在您的案例中正是这样。解决方案是根本不使用mapcount,因为您不需要/使用它们来实现它们的预期用途,而是使用单个forEach

public void updateQrCodeUrlByBusinessDetails(Long businessId, String menuUrl, MENU_TYPE menuType) {
List<BusinessQRCode> businessQrCode = qrCodeRepo.findByBusinessId(businessId);
businessQrCode.stream().forEach(qr -> {
qr.setMenuUrl(menuUrl);
qr.setMenuType(menuType);
qrCodeRepo.save(qr);
});
}

请注意,您可以使用for循环做完全相同的事情,只需更少的调用、相同的线路数量,并且不必使用流:

public void updateQrCodeUrlByBusinessDetails(Long businessId, String menuUrl, MENU_TYPE menuType) {
List<BusinessQRCode> businessQrCode = qrCodeRepo.findByBusinessId(businessId);
for (BusinessQRCode qr : businessQrCode) {
qr.setMenuUrl(menuUrl);
qr.setMenuType(menuType);
qrCodeRepo.save(qr);
};
}

只有我的两分钱。

您应该始终从查询结果中返回Optional。您可以将其作为:

在存储库中:

Optional<List<BusinessQRCode>> findByBusinessId(Long businessId);

服务中:

public void updateQrCodeUrlByBusinessDetails(Long businessId, String menuUrl, MENU_TYPE menuType) {
// Fetch iterate, if exist
qrCodeRepo.findByBusinessId(businessId).ifPresent(qrCodes_ -> {
qrCodes_.forEach(code_-> {
qr.setMenuUrl(menuUrl);
qr.setMenuType(menuType);
});
qrCodeRepo.saveAll(qrCodes_);
});

当你返回相同的qr时,为什么要使用map。您可以跳过该部分,也可以跳过收集功能。我们已经有了qrCodes的列表,只需迭代它们并设置值,然后一次保存所有值。

在对代码进行一些更改后,它可以在开发和生产中按预期工作。我只是更改map()中的对象值,然后返回使用Collectors.toList()方法收集要列出的对象,然后再次使用forEach()循环并更新实体数据。现在代码按预期工作。

public void updateQrCodeUrlByBusinessDetails(Long businessId, String menuUrl, MENU_TYPE menuType) {
List<BusinessQRCode> businessQrCode = qrCodeRepo.findByBusinessId(businessId);
businessQrCode.stream().map(qr -> {
qr.setMenuUrl(menuUrl);
qr.setMenuType(menuType);
return qr;
}).collect(Collectors.toList()).forEach(qr -> qrCodeRepo.save(qr));
}

相关内容

  • 没有找到相关文章

最新更新