Método para salvar registro não retorna informação corretamente

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();
		}
	}

Log:

Hibernate: 
    insert 
    into
        Veiculo
        (ano, arcondicionado, cambioAutomatico, cor, fabricante, modelo, motor, pathImagem, placa, qtdPortas, situacao, tipo, tipoDirecao, valorDiaria) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Alterado

Que veículo esperas obter aqui? Tens de colocar where na tua classe para verificar se a placa já existe ou não.

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”.

@Override
	public void salvar(Veiculo t) {
		try {
			this.entityManager.getTransaction().begin();
			if (t.getId() == null) {
				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();
		}
	}

O resultado foi o mesmo:

Hibernate: 
    insert 
    into
        Veiculo
        (ano, arcondicionado, cambioAutomatico, cor, fabricante, modelo, motor, pathImagem, placa, qtdPortas, situacao, tipo, tipoDirecao, valorDiaria) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Alterado

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!