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().
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.
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.
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.