spring-data JpaRepository Optional orElse 重复实体

spring-data JpaRepository Optional orElse duplicate entity

我得到了相同代码的两个版本(我假设):

Optional<UserHolder> user = userHolderRepository.findOneByUserId(source.getId());
return user.isPresent()
    ? user.get()
    : userHolderRepository.save(new UserHolder(source.getId(), source.getLogin()));

UserHolder userHolder = userHolderRepository
            .findOneByUserId(source.getId())
            .orElse(userHolderRepository.save(new UserHolder(source.getId(), source.getLogin())));

        return userHolder;

我还得到了一个 Message 实体,其中有 @ManyToOne 个 userHolders。

如果我调用上面的代码来获取用户持有者(如果存在,或者创建一个),第一个代码片段运行良好,而第二个代码片段总是导致创建第二个具有相同 ID 的用户持有者。

我认为代码片段的行为并不相同,但我应该如何编写 Optional 风格的代码才能与第一个片段完全相同?

谢谢!

解决这个问题的正确方法是

UserHolder userHolder = userHolderRepository
            .findOneByUserId(source.getId())
            .orElseGet(() ->userHolderRepository.save(new UserHolder(source.getId(), source.getLogin())));

        return userHolder;

因为如 所述,orElse 始终生成对象,即使 Optional 确实包含一个值。