spring-data JpaRepository可选的orElse重复实体

时间:2016-07-05 14:35:50

标签: java spring spring-data spring-data-jpa

我有相同代码的2个版本(我假设):

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的第二个userHolder。

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

谢谢!

1 个答案:

答案 0 :(得分:1)

解决此问题的正确解决方案是

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

        return userHolder;

因为描述here,orElse总是生成对象,即使Optional确实包含值。