2016-07-05 21 views
-2

我有2個版本相同的代碼(我假設):彈簧數據JpaRepository可選否則容易重複的實體

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樣式代碼以與第一個片段完全相同?

謝謝!

回答

0

正確的解決方案來解決這個是

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

     return userHolder; 

因爲等中描述here,否則容易總是生成對象,即使Optional確實包含的值。