Chave composta usando JPA

5 respostas
F

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!!

5 Respostas

Y

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:

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;
    }
F

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!!

F

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!!

F

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!!!

Y

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.

Criado 19 de outubro de 2006
Ultima resposta 27 de out. de 2006
Respostas 5
Participantes 2