2016-07-05 15 views
-2

Ich habe 2 Versionen des gleichen Code (Ich gehe davon aus):feder Daten JpaRepository Optional OrElse doppelte Einheit

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

und

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

     return userHolder; 

Ich habe auch eine Message Einheit mit @ManyToOne userHolders.

Wenn ich den obigen Code aufrufen, um einen Benutzerhalter zu erhalten (falls vorhanden, oder stattdessen einen erstellen), funktioniert das erste Snippet gut, während das zweite Snippet immer dazu führt, einen zweiten userHolder mit derselben ID zu erstellen.

ich denke, die Code-Snippets verhalten sich nicht identisch, aber wie sollte ich den Optional Style-Code schreiben, um genau das gleiche wie das erste Snippet zu sein?

Danke!

Antwort

0

die richtige Lösung dieses Problem zu lösen ist

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

     return userHolder; 

denn wie here beschrieben, OrElse immer das Objekt erzeugt, selbst wenn die Optional Wert enthält.