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
确实包含一个值。
我得到了相同代码的两个版本(我假设):
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;
因为如 Optional
确实包含一个值。