sobreposição de equals / hashcode para usar sets no hibernate.  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
javinha2004
JavaTeenager

Membro desde: 30/04/2004 09:00:53
Mensagens: 169
Offline

Pessoal,
estou lendo o manual do hibernate 3 (para ver se eu paro de apanhar dele... ) 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...
louds
Moderador
[Avatar]

Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline

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.

http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda
[ICQ]
Rafael Steil
Administrador
[Avatar]

Membro desde: 31/08/2002 02:35:53
Mensagens: 5984
Localização: São Paulo
Offline

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

Rafael

"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"

http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil
[Email] [WWW]
javinha2004
JavaTeenager

Membro desde: 30/04/2004 09:00:53
Mensagens: 169
Offline

louds wrote: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.


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?

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

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

Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline

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.

http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda
[ICQ]
javinha2004
JavaTeenager

Membro desde: 30/04/2004 09:00:53
Mensagens: 169
Offline

valeu, acho que agora está ficando claro para mim...
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

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

http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team