Criei um método que tanto salva como altera um registro do banco de dados. O problema é que o método não mostra a mensagem de “Cadastrado” e sim de “Alterado”, sendo que o objeto foi inserido no banco e não alterado.
@Override
public void salvar(Veiculo t) {
try {
this.entityManager.getTransaction().begin();
if (t.getId() == null) {
for (Veiculo veiculo : listarTudo(Veiculo.class, "Select u from Veiculo u")) {
if (veiculo.getPlaca().equals(t.getPlaca())) {
System.out.println("Placa já existe");
}
}
this.entityManager.persist(t);
System.out.println("Cadastrado");
} else {
this.entityManager.merge(t);
System.out.println("Alterado");
}
this.entityManager.getTransaction().commit();
} catch (
RuntimeException e) {
this.entityManager.getTransaction().rollback();
e.printStackTrace();
}
}
Eu percorro toda a lista de veículos para identificar se algum veículo do banco contém a mesma placa do véiculo que foi passado no método. Eu fiz esse mesmo modelo de método salvar para a classe de Usuario para verificar se o cpf já estava cadastrado e funcionou normalmente. Somente no método de salvar o veículo que está dando este problema. Para testes retirei o bloco for e não mudou nada. Ele continua mostrando “Alterado” ao invés de “Cadastrado”.
O teu Id não está a null, e por isso ele está a executar o else e não o if. Já não mexo com hibernate há alguns anos mas penso que o merge faz o insert se o id não existir.
Eu não sabia que o merge também fazia um persist. Fiz um teste aqui e verifiquei que é isso mesmo. E o meu id tava setado como long ao invés de Long, retornando 0 ao invés de null. Obrigado pela observação amigo!