[RESOLVIDO] Problema ao deletar objeto de uma lista  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
f2pro
JavaTeenager
[Avatar]

Membro desde: 06/12/2010 08:17:32
Mensagens: 163
Offline

Pessoal, estou com um sério problema
estou usando o primefaces 2.1 com JSF 2.0
e, numa dataTable onde eu clico na linha, ele passa para um objeto contato_selecionado e depois, ao clicar em remover ocorre algo estranho.

suponhamos que tenha 3 contatos, selecione qualquer um deles sempre o primeiro é o excluido.. porém.. se eu der ou system.out.printLn(this.contato_selecionado.getNome()); por exemplo ele lista o nome do objeto que eu realmente selecionei...

segue abaixo o código..

contatos.xhtml


e o CadastroContatosMB.java





This message was edited 1 time. Last update was at 27/01/2011 15:02:31


F2PRO Soluções Inteligentes
www.f2pro.com.br
[WWW]
brrodo
JavaTeenager

Membro desde: 07/02/2009 23:31:16
Mensagens: 173
Offline

Sua classe Contato implementa o método "equals" corretamente?
f2pro
JavaTeenager
[Avatar]

Membro desde: 06/12/2010 08:17:32
Mensagens: 163
Offline

creio que sim cara...
ele foi gerado automaticamente com o hibernate ...

This message was edited 1 time. Last update was at 27/01/2011 11:16:30


F2PRO Soluções Inteligentes
www.f2pro.com.br
[WWW]
brrodo
JavaTeenager

Membro desde: 07/02/2009 23:31:16
Mensagens: 173
Offline

f2pro wrote:creio que sim cara...
ele foi gerado automaticamente com o hibernate ...


Me parece que o método "List.remove()" está usando o método "Object.equals()" para determinar a igualdade entre os objetos de Contato no momento da remoção, por isso o comportamento inesperado.

Você deve sobrescrever o método em Contato.
f2pro
JavaTeenager
[Avatar]

Membro desde: 06/12/2010 08:17:32
Mensagens: 163
Offline

brrodo wrote:
f2pro wrote:creio que sim cara...
ele foi gerado automaticamente com o hibernate ...


Me parece que o método "List.remove()" está usando o método "Object.equals()" para determinar a igualdade entre os objetos de Contato no momento da remoção, por isso o comportamento inesperado.

Você deve sobrescrever o método em Contato.



segue abaixo o meu equals...


F2PRO Soluções Inteligentes
www.f2pro.com.br
[WWW]
f2pro
JavaTeenager
[Avatar]

Membro desde: 06/12/2010 08:17:32
Mensagens: 163
Offline

Pessoal.. já resolvi
com as pistas que me deram.. eu criei outro equals... dai comparando campo a campo, nao todos até agora...

segue o codigo a baixo...



alguem sabe de outro modo mais efetivo? caso tenha vários campos..
abraços...

F2PRO Soluções Inteligentes
www.f2pro.com.br
[WWW]
brrodo
JavaTeenager

Membro desde: 07/02/2009 23:31:16
Mensagens: 173
Offline

f2pro wrote:
brrodo wrote:
f2pro wrote:creio que sim cara...
ele foi gerado automaticamente com o hibernate ...


Me parece que o método "List.remove()" está usando o método "Object.equals()" para determinar a igualdade entre os objetos de Contato no momento da remoção, por isso o comportamento inesperado.

Você deve sobrescrever o método em Contato.



segue abaixo o meu equals...



Cheque se o atributo "codigo_contato" do "contato_selecionado" não está null.

Eu colocaria um breakpoint no método "equals" da classe Contato e debugaria para ver se o comportamento dele está adequado.

Esse problema não tem a ver com o JSF, tem a ver com o método "List.remove" q não consegue identificar qual objeto da lista é igual ao objeto "contato_selecionado" q é passado como parâmetro para removê-lo.
brrodo
JavaTeenager

Membro desde: 07/02/2009 23:31:16
Mensagens: 173
Offline

f2pro wrote:Pessoal.. já resolvi
com as pistas que me deram.. eu criei outro equals... dai comparando campo a campo, nao todos até agora...

segue o codigo a baixo...



alguem sabe de outro modo mais efetivo? caso tenha vários campos..
abraços...


Pra definir a igualdade, vc precisa sobrescrever tanto o método "hashcode()" quanto "equals()" da classe Object.

Geralmente se vc gerou o hashcode utilizando apenas o atributo "id" da classe, vc implementa o "equals" utilizando apenas esse mesmo atributo. Ou seja, utilize os mesmos atributos pra definir tanto o hashcode qt a igualdade pelo método "equals".

Eu colocaria o atributo "codigo_contato" como "int" e usaria uma implementaçaõ mais simples:

 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team