Comparar objetos

estou com uma duvida na comparacao d objetos obtidos do banco de dados mysql utilizando o hibernate.

oq acontece eh o seguinte. pego dois objetos iguais do banco de dados, ouseja da mesma linha, se utilizar isso

obj1.equals(obj2) ele da false. pq isso esta acontecendo? e se tambem fizer:

obj1.getID() == obj2.getID() tambem esta dando false, oq esta acontecendo? se mando imprimir os ids imprime corretamente e igual.

Bom, acredito que o problema esteja ocorrendo pq vc precisa sobrescrever o método equals do seu objeto dizendo o que vc considera para que dois objetos sejam iguais.

Não sei se o Hibernate faz algo pra vc relacionado a isso…mas acho que esse é o problema

Verifique se o retorno de obj1.getID() é uma String, se for, experimente mudar para:

obj1.getID().equals(obj2.getID());

noa é um string, é um int =/

obj1.getID() == obj2.getID() 

se os ids forem iguais eles são o mesmo objeto.

Amigo, quando você compara objetos em java usando == o que você está comparando é o endereço de memória dos objetos, não seus conteúdos. Para comparar o conteúdo (ou estado) dos objetos, você precisa utilizar o método equals(), fornecido pelo classe “pai” de todas, o Object. Mas é só isso? Não!
Como a JVM vai saber, para um objeto que você mesmo criou, o que é igual e o que não é? Simples! Você reescreve o método equals na sua classe!

Para fazer isso, você deve seguir algumas regrinhas. Sejam 3 objetos da mesma classe, ‘a’, ‘b’ e ‘c’:

  1. Se a.equals(b), então b.equals(a) também deve ser verdadeiro.
  2. a.equals(a) deve retornar verdadeiro
  3. Se a.equals(b) e b.equals© então a.equals© tbm deve ser verdadeiro.

Você pode sobrescrever seu método equals mais ou menos assim, mas isso é específico para este objeto que você criou:

public boolean equals(Object obj){
   if(obj instanceof SuaClasse)
      return obj.getId == this.id;
   else return false;
}

Agora, se seu ID foi definido como String e não como um tipo primitivo (como int), dai vc tem outro problema, porque fazer obj.getId() == this.id também irá comparar endereços de memória, visto que Strings são objetos! Então neste caso, dentro do equals, vc teria que comparar assim:

...
return obj.getId().equals(id);

int ou Integer, note que int é um tipo primitivo e Integer vai se referir a um objeto da classe Integer.

Se for Integer, fazer o que marcelo_mococa disse é tentar verificar se os dois objetos são os mesmos e acredito que você esteja querendo saber se o conteúdo é igual.

Se quiser verificar o conteúdo de dois objetos Integer utilize o método equals, assim como em String, ou seja, troque a sua comparação por:

obj1.getID().equals(obj2.getID())

ele disse int, portante ele deve usar ==.
Se for um Integer daí sim ele usa equals…

obg pela a ajuda de todos, vou tentar agora

obg pela auda de todos, estou com uma seguinte duvida agora q nao consigo pensar em como fazer a uma semana jah

o problema eh o seguinte:

eu tenho um campo em q a pessoa precisa digitar um codigo de um carro, so q como existe uns 10 mil carros eh impossivel decorar todos, oq fiz foi o seguinte:

colokei um botao do lado q abre um jtable em um novo jframe sem fechar o anteriro, com duas colunas do codigo e do nome do carro do qual a pessoa poderia selecionar e apertar escolher.
oq gostaria q acotnecesse qd apertasse escolher era q essa jframe do jtable fechasse e inseri-se o codigo q estava selecionado no jtextfield. como posso fazer isso?

Cara, eu usava muito recursos desse tipo no DELPHI (que saudade). Como eu normalmente fazia ? bem… eu atribuia o valor selecionado a tag do Formulario daí na volta do formulario antes de dar o dispose nele eu recuperava esse valor, no delphi isso era muito limitado porque a tag do form é um int mas no java vc poder criar um atributo, pra representar a tag, no seu form do tipo que vc quiser :wink: só ha uma restrição o form com a jtable deve ser MODAL pra isso funcionar legal. saca só o exemplo :wink: não é a melhor saída mas acho que ajuda.


//abre o formulario MODAL
JDialog d = new JDialog(this, true); //leia mais sobre JDialogs em http://www.guj.com.br/posts/list/58732.java#312932
d.setVisible(true);

if (d.getTag() != null){
JTextField_codigoCarro.setText( d.getTag().getCodigoCarro() ); 
}

bem, como eu disse, o JDialog não tem um atributo Tag mas nada impede vc de criar um atributo que guarde o valor selecionado daí quando o usuario escolher um item no jtable vc atribui o valor escolhido a esse atributo.


//pega o objeto selecionado e atribui ao tag do Dialog
Objeto carroSelecionado = getCarroSelecionadoNoJTable();
this.setTag(carroSelecionado);
this.Disposing();
  • É importante o Dialog ser modal porque quando um dialog é modal o fluxo de execução da thread é transferido para a Dialog aberta voltando a fluxo normal somente depois que a Dialog é fechada com isso funciona tudo perfeitamente no seguinte cenario:
1 - A dialog é criada e zera o valor selecionado (tag = null)
2 - A dialog é exibida passando o fluxo de execução para o codigo da dialog (d.setVisible(this, true))
3 - O usuario seleciona o item na lista, o seu manipulador de eventos atribui a variavel e fecha a dialog this.setTag( valorSelecionado ); this.dispose())
4 - O fluxo de execução volta para a linha subsequente a exibição do dialog (if (d.getTag() != null) {...} )
5 - Nesse instante vc tem perfeito controle ainda sobre a referencia e os atributos da dialog podendo fazer o que quiser com o valor armazenado na variavel tag.

espero ter ajudado…

Coloca a sua JTable em um JDialog, nao em um JFrame…

no seu JDialog, vc cria um atributo que vai receber o valor selecionado…
vc seta esse valor no método valueChanged da interface ListSelectionListener.

qdo vc der OK, vc pegar esse valor do seu dialog ( criando ums getter pra esse atributo no seu componente dialog )

algo parecido com isso:

JDialogConsulta consulta = new JDialogConsulta( oFrameQueDeveContinuarVisivelNoFundo )

// aqui a execução é transferida pro seu dialog e so continua depois que seu dialog é fechado ( isso qdo modal )
consulta.setVisible( true );

// daí pra frente vc faz o q qusier com seu objeto selecionado
if ( consulta.getCarroSelecionado() != null ) {
int x = consulta.getCarroSelecionado().getId();
}

só completando…

procure dar uma estudada em JTable pra ver como adicionar o objeto inteiro nela… evite de ficar adicionando int, Strings, etc…

tava quase conseguindo eu axo, oq acontece eh q o dono da tabela q ira abrir nao eh um jframe e sim um jpanel ja q eh um jframe com 4 abas.

tem como fazer?

bem, consegui contornar oq disse acima e fiz td direitinho so q esta dando o seguitne erro?

Exception occurred during event dispatching:
java.lang.ArrayIndexOutOfBoundsException: 2035 >= 2035
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source)
at javax.swing.JTable.getValueAt(Unknown Source)
at gui.TabelaMunicipio.evento(TabelaMunicipio.java:203)
at gui.TabelaMunicipio$1.actionPerformed(TabelaMunicipio.java:88)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.Dialog$1.run(Unknown Source)
at java.awt.Dialog$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Dialog.show(Unknown Source)
at java.awt.Component.show(Unknown Source)
at java.awt.Component.setVisible(Unknown Source)
at java.awt.Window.setVisible(Unknown Source)
at java.awt.Dialog.setVisible(Unknown Source)
at gui.AbaCliente.tabela(AbaCliente.java:335)
at gui.AbaCliente.access$2(AbaCliente.java:333)
at gui.AbaCliente$1.actionPerformed(AbaCliente.java:145)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

eu fiz o seguinte:

TabelaMunicipio tabela = new TabelaMunicipio(frame, true); tabela.setVisible(true); if(tabela.getTag() != null) { jTextField10.setText(tabela.getTag());

e qd aciono o evento de selecao da tabela ele salva a informacao selecionada no tag e da dispose();

tem algo d errado?
a tag eu inicializo com null

percebi q vcs utilizam metodos diferentes q estou usando iguais, so nao entendi pq

ai esta:

if(tabela.getTag() != null) { jTextField10.setText(tabela.getTag());

pra setar o texto vcs usam algo como

jTextField10.setText(tabela.getTag().getcodigo());

pq?

alguma sugestao?

Não não… parece certinho como descrevemos… deveria estar funcionado, que problema vc ta tendo ???

estamos usando uma sintaxe diferente tipo:

JTextField1.setText ( frame.getTag().getCodigo());

o lance do getCodigo() depois de getTag() é ipotetisando que vc atribuiu para tag um “objeto” que tem atributos, sendo que o que estamos pegando é o código, mas se vc quisesse por exemplo colocar a descrição e sua objeto tivesse vc poderia fazer;

JTextField1.setText ( frame.getTag().getDescricao());

mas sim… se tiver ainda algum problema posta aí, o que ta acontecendo ???

espero ter ajudado…

qd eu aperto o botao escolher q ele adiciona oq ele escolheu a tag e depois da dispose acontece esse erro:

Exception occurred during event dispatching: java.lang.ArrayIndexOutOfBoundsException: 2035 >= 2035 at java.util.Vector.elementAt(Unknown Source) at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source) at javax.swing.JTable.getValueAt(Unknown Source) at gui.TabelaMunicipio.evento(TabelaMunicipio.java:203) at gui.TabelaMunicipio$1.actionPerformed(TabelaMunicipio.java:8 at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.Dialog$1.run(Unknown Source) at java.awt.Dialog$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.awt.Dialog.show(Unknown Source) at java.awt.Component.show(Unknown Source) at java.awt.Component.setVisible(Unknown Source) at java.awt.Window.setVisible(Unknown Source) at java.awt.Dialog.setVisible(Unknown Source) at gui.AbaCliente.tabela(AbaCliente.java:335) at gui.AbaCliente.access$2(AbaCliente.java:333) at gui.AbaCliente$1.actionPerformed(AbaCliente.java:145) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

alguem sabe oq eh? nunk vi esse erro