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

Jat*_*der 2 java spring jpa

我正在使用 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();

    }
Run Code Online (Sandbox Code Playgroud)

luk*_*302 6

问题是 count

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

而这正是发生在你的情况。解决的办法是既不使用map或者count根本,因为你不需要做/用他们什么,他们都应该被用于,而是使用一个单一的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);
    });
}
Run Code Online (Sandbox Code Playgroud)

请注意,您可以使用 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);
    };
}
Run Code Online (Sandbox Code Playgroud)