sobreposição de equals / hashcode para usar sets no hibernate

Pessoal,
estou lendo o manual do hibernate 3 (para ver se eu paro de apanhar dele… :wink: ) e no capítulo 4 ele diz que os métodos equals/hashcode tem que ser reimplementados se vc trabalha com sets cujos elementos são modificados em várias sessões.
Isso vale para Lists?
Pergunto porque eu não sabia disso, tenho um app que faz exatamente isso, altera sucessivamente os elementos de uma série de arraylists. E faz isso em um monte de sessões diferentes.
Duas dessas listas tem inclusive a coluna de índice sempre alterada, porque os seus elementos são reordenados de tempos em tempos. E a app parece se entender com o banco perfeitamente, mesmo eu não tendo mexido com equals / hashcodes.
Será que é sorte de principiante??
Em que circunstâncias eu tenho que realmente me preocupar com esses métodos?
Agradeço as opiniões dos cobras do hibernate…
:wink:

Sempre que usar Set ou como chave de um Map, com List somente se você depende do método contains e identidade não basta.

Vale sempre lembrar de não usar as propriedades da primary key quando montar o equals e o hashcode.

javinha, soh complementando o que o louds disse, Sets utilizam Maps internamente - ou seja, o funcionamento eh bastante difernete de um List

Rafael

[quote=louds]Sempre que usar Set ou como chave de um Map, com List somente se você depende do método contains e identidade não basta.
[/quote]

Deixa eu ver se entendi:

  • se usar o Set, tem que reimplementar equals/hashcode de qualquer forma
  • se eu usar o contains do list… desculpe a lentidão de raciocínio, não entendi esse “SE identidade não basta”. Vc podia exemplificar para mim?

Ah, isso o manual fala. Essa parte eu entendi, é para usar o que ele chama de chave de negócio. :smiley:
Valeu a atenção, galera.

O javadoc de List fala que contains usa o método equals para verifica igualdade. Então se você depende da chave de negocio para verificar isso, tem que sobrescrever o equals/hashcode.

valeu, acho que agora está ficando claro para mim…

os contratos das interfaces Set, Map, List e etc nao dizem nada a respeito de hashCode. vc deve ler o javadoc da implementacao para descobrir se determinada classe vai usar ou nao uma estrutura de hash, ai sim reimplemntar hashCode.

na maioria dos Sets usa-se o hashcode, mas ha excecoes (TreeSet). Todos os Mapas da sun usam hashCode e nenhuma List da sun usa (mas vc poderia ter listas mais espertinhas que o contains iria buscar num hash… nada impede).

claro que se vc reescrever o equals, precisa manter o cotnrato da object pra nao correr o risco de alguem colocar numa estrutura dque precisa de hash