02 maio 2008

hashCode() e equals() no Hibernate

Se você está manipulando elementos numa coleção persistente (PersistentSet) do hibernate, por via das dúvidas, sobrescreva os métodos equals() e hashCode(). Por quê? Veja isso: A implementação automática dos métodos equals() e hashCode() do Eclipse é falha, não realiza encapsulamento, e no caso do Timestamp e do Date, realiza justamente a comparação falha que é descrita no artigo acima. Então, o melhor a fazer seria usar o compareTo() dentro do equals(), e no caso do hashCode(), fazer algo parecido com isso:
public int hashCode() {
 final int prime = 31;
 int result = 1;

 if (getDataHoraFim() != null) {
     Calendar calendar = Calendar.getInstance();
     calendar.setTime(getDataHoraFim());

     result = prime * result
             + calendar.get(Calendar.YEAR);
     result = prime * result
             + calendar.get(Calendar.MONTH);
     result = prime * result
             + calendar.get(Calendar.DATE);
     result = prime * result
             + calendar.get(Calendar.HOUR_OF_DAY);
     result = prime * result
             + calendar.get(Calendar.MINUTE);
 }

 ...
}
note que esta implementação é totalmente diferente da implementação de hashCode() do java, que é algo parecido com:
((int) getDataFim().getTime()) ^
((int) (getDataFim().getTime() >>> 32))
Comentários
0 Comentários

0 comments:

Postar um comentário

Regras são chatas, mas...

- Seu comentário precisa ter relação com o assunto do post;
- Em hipótese alguma faça propaganda de outros blogs ou sites;
- Não inclua links desnecessários no conteúdo do seu comentário;
- Se quiser deixar sua URL, comente usando a opção OpenID;
- CAIXA ALTA, miguxês ou erros de ortografia não serão tolerados;
- Ofensas pessoais, ameaças e xingamentos não são permitidos;