Chave composta usando JPA

Galera, meu problema é o seguinte:

Estou usando annotations para mapear uma tabela. Essa tabela possui chaves primárias compostas.
Então crei uma classe para as chaves primárias e utilizei esta classe na minha entidade utilizando @EmbeddedId.
Só que pra fazer isso eu preciso redefinir os métodos equals() e hashCode() da classe contendo as chaves primárias. Eu redefini o método equals() mas naum sei como fazer para o método hashCode().

Alguém sabe como eu devo fazer??

Qualquer ajuda eu agradeço.

Valeu!!

Tb estou usando JPA e Chave composta…
Desculpa a minha ignorancia mas para que vc usa esses metodos???

Não sei se ajuda eu estou usando o GlassFish e o NetBeans 5.5 e ele criou esses metodos assim p mim:

[code]
public int hashCode() {
int hash = 0;
hash += (this.id != null ? this.id.hashCode() : 0);
hash += (int)id2;
return hash;
}

public boolean equals(Object object) {
    // TODO: Warning - this method won't work in the case the id fields are not set
    if (!(object instanceof idPK)) {
        return false;
    }
    ItemPedidoPK other = (ItemPedidoPK)object;
    if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) return false;
    if (this.id2 != other.id2) return false;
    return true;
}[/code]

Olha…eu também não sou expert no assunto não…hehehe…
Mas pelo que andei pesquisando, como você está definindo uma chave composta você precisa redefinir o método equals() para indicar quando dois objetos vão representar o mesmo registro no banco. Por exemplo o meu método ficou assim:

	public boolean equals(Object obj) {
		if (obj == this) {
			return true;
		}
		if (this.getClass() != obj.getClass()) {
			return false;
		}
		if (obj == null) {
			return false;
		}

		final TopcatMercadoPK pk = (TopcatMercadoPK) obj;
		return pk.mercado.equals(this.mercado) && pk.topcat.equals(this.topcat);

	}

O método hashCode() deve retornar o mesmo valor para dois objetos que representem o mesmo registro, logo também devem ser redefinidos. O meu ficou da seguinte forma:

[code]
public int hashCode() {

	final int PRIME = 31;
	int result = 1;
	result = PRIME * result
			+ ((this.topcat == null) ? 0 : this.topcat.hashCode());
	result = PRIME * result
			+ ((this.mercado == null) ? 0 : this.mercado.hashCode());

	return result;
}

[code/]

Eu redefini o método hashCode() utilizando um exemplo que achei na net. Então não entendi muito bem como funciona ainda.

Se alguém souber por favor me explique.

Valeu!!

ynaue,

acho que os métodos equals() e hashCode que inseri na última mensagem não são o problema agora. Acho que não estou criando a classe e primary keys corretamente.

Será que tem como você me passar um exemplo do uso de @EmbeddedId??
É que o mapeamento da classe não está sendo criado corretamente.

Valeu!!

Fala galera!!

Estou evoluindo…hehehe…
Descobri que o problema é que a minha classe onde eu armazeno as minhas chaves primárias não pode conter relacionamentos @ManyToOne. Quando eu utilizo apenas campos sem relacionamento funciona normal. Mas quando eu preciso utilizar uma chave composta onde alguma das chaves é um relacionamento @ManyToOne ocorre o erro.

Se alguém já tiver passado por algo parecido e puder me ajudar.

Obrigado!!!

Voce conseguiu solucionar esse seu ultimo problema???
Estou com o mesmo!

Um dos itens da minha chave composta é um relacionamento de muito para um. Como eu resolvo isso???

Obs//:Desculpa a ausencia, mas não sei pq não estou recebendo e-mail me notificando que as mensagens estão sendo respondidas.