Bom dia pessoal, Estou com o seguinte problema: Tenho um regra no meu sistema que não permite criar pessoas com mesmo documento e o mesmo nome. Então eu faço essa verificação com o SpringJpa retornando um Optional e orElse() e se não existir eu crio uma nova pessoa.
private Person savePerson(String document, String name) {
Person person = new Person();
person.setDocument(document);
person.setName(name);
person.setId(UUID.randomUUID());
return personRepository.save(person);
}
Porém antes de criar a pessoa eu uso este método para verificar se ela existe ou não...
public Person checkPersonOrCreate(Person person) {
return personRepository.findByDocumentAndName(person.getDocument(), person.getName()).
.orElse(savePerson(person.getDocument(), person.getName()));
}
O problema é que, quanto executo o método checkPersonOrCreate e a pessoa existi, o que é executado primeiro é a chama para o método savePerson, salvando a pessoa na base e duplicando as informações. O que é errado seguindo a regra do meu sistema. Consegui resolver esta situação retirando o orElse() e usando o isPresent() , porém não consegui entender por que o meu método savePerson dentro do orElse() é executado mesmo o meu método findByDocumentAndName() retornando uma pessoa que existe.
Código que funciona
public Person checkPersonOrCreate(Person person) {
return (personRepository.findByDocumentAndName(person.getDocument(), person.getName()).isPresent())
? personRepository.findByDocumentAndName(person.getDocument(), person.getName()).get()
: savePerson(person.getDocument(), person.getName());
}