| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/05/2005 17:22:19
|
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...
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/05/2005 17:39:27
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/05/2005 20:43:36
|
Rafael Steil
Administrador
![[Avatar]](/images/avatar/8e296a067a37563370ded05f5a3bf3ec.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/05/2005 10:53:13
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/05/2005 16:32:46
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/05/2005 08:32:21
|
javinha2004
JavaTeenager
Membro desde: 30/04/2004 09:00:53
Mensagens: 169
Offline
|
valeu, acho que agora está ficando claro para mim...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/05/2005 16:55:42
|
Paulo Silveira
Administrador
![[Avatar]](/images/avatar/a87ff679a2f3e71d9181a67b7542122c.jpg)
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
|
|
|
 |
|
|