[Hibernate] Duplicando objeto ao atualizar

Galera,

Estou com um problema ao utilizar o método saveOrUpdate. Na atualização de um objeto no banco, ele cria outro registro. Segue método de persistência:

@Override
	public void salvar(Resposta resposta) {
		this.session.saveOrUpdate(resposta);
	}

E o meu objeto que estou tentando persistir, possui a implementação de equals e hashcode. Como teste, alterei a implementação destes 2 métodos baseado em todos os atributos da classe:

@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((dataAlteracao == null) ? 0 : dataAlteracao.hashCode());
		result = prime * result
				+ ((dataCadastro == null) ? 0 : dataCadastro.hashCode());
		result = prime * result
				+ ((flgResposta == null) ? 0 : flgResposta.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result
				+ ((idPergunta == null) ? 0 : idPergunta.hashCode());
		result = prime * result
				+ ((idQuestionario == null) ? 0 : idQuestionario.hashCode());
		result = prime * result
				+ ((obsResposta == null) ? 0 : obsResposta.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Resposta other = (Resposta) obj;
		if (dataAlteracao == null) {
			if (other.dataAlteracao != null)
				return false;
		} else if (!dataAlteracao.equals(other.dataAlteracao))
			return false;
		if (dataCadastro == null) {
			if (other.dataCadastro != null)
				return false;
		} else if (!dataCadastro.equals(other.dataCadastro))
			return false;
		if (flgResposta == null) {
			if (other.flgResposta != null)
				return false;
		} else if (!flgResposta.equals(other.flgResposta))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (idPergunta == null) {
			if (other.idPergunta != null)
				return false;
		} else if (!idPergunta.equals(other.idPergunta))
			return false;
		if (idQuestionario == null) {
			if (other.idQuestionario != null)
				return false;
		} else if (!idQuestionario.equals(other.idQuestionario))
			return false;
		if (obsResposta == null) {
			if (other.obsResposta != null)
				return false;
		} else if (!obsResposta.equals(other.obsResposta))
			return false;
		return true;
	}

Já tiveram este problema?

qual o atributo identificador do seu objeto (na tabela)? se ele estiver diferente, ele vai criar um novo registro

Desculpa a demora pra responder…

Mas voltando ao problema, ele não deveria respeitar o meu método equals? Por exemplo, se eu digo que X propriedades identificam um objeto, quando eu fosse gravar um outro objeto com as mesmas X propriedades ele deveria saber que se trata de uma atualização. Ou estou errado?

Quem manda é o ID, como o digaoneves falou.

Se não, imagine, o hibernate teria que chamar equals para todos os objetos persistidos na base de dados para saber se este objeto que você está querendo salvar existe ou não ?