GRAVE: Could not synchronize database state with session

Java

07/12/2011

Bom dia meus caros.

Estou desenvolvendo uma aplicação JSE com um CRUD básico , para persistência utilizo Hibernate. Bem , irei passar a ideia do sistema: tenho uma tela de cadastro que funciona blz, os dados estou apresentando em um JTable, onde dou a opção de alterar ou excluir algum registro. Ao clicar em alterar eu pego os dados da linha selecionada dou um setVisible(true) abro minha tela de alteração e na hora que clico no botão –confirmar alteracao- o seguinte erro acontece:

GRAVE: Could not synchronize database state with session
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1.

Algum dos mestres já passaram por isto? Alguma dica ou solução?
Lucas Costa

Lucas Costa

Curtidas 0

Respostas

Anthony Accioly

Anthony Accioly

07/12/2011

As três causas mais comuns para essa exceção são:

1. O mapeamento do ID da entidade difere da PK no banco. (Nesse caso, ao fazer o update, o hibernate não está encontrando a linha a ser atualizada)... Para identificar esse erro, habilite o log do hibernate (setando os parâmetros: hibernate.show_sql e hibernate.format_sql) e verifique a clausula where comando de update.
2. Você está usando um objeto para representar pk composta e esqueceu de sobreescrever os métodos equals e hashCode.
3. Você está esquecendo de abrir / comitar transações e fechar sua Session (ou EntityManager no caso de JPA). Veja aqui: http://www.coderanch.com/t/216734/ORM/java/Hibernate-Batch-update-returned-unexpected.

Tente debugar esses três cenários e se precisar de mais ajuda poste os pedaços relevantes do código para gente (mapeamento das pks e código que manipula a sessão).

Abraços.
GOSTEI 0
Anthony Accioly

Anthony Accioly

07/12/2011

Esqueci de outro cenário popular:

4. Veja se os parâmetros do ID estão preenchidos corretamente no objeto antes do update. (Imprima os valores do ID na tela antes de executar o update, ou monitore as variáveis de ID através de um debugador).
GOSTEI 0
Davi Costa

Davi Costa

07/12/2011

Acontece muito tb ao tentar atualizar (update), um objeto que não foi salvo. Ou vc está dando um update sem nunca ter dado insert ou vc está tentando atualizar um objeto transiente, que não foi consultado do banco.

att Davi
GOSTEI 0
Lucas Costa

Lucas Costa

07/12/2011

Saudações meus caros!!
Meu caro Davi Gomes, o objeto esta sendo persistido no banco, imprimi o valor dele para ter certeza disso, neste caso ele de fato nao é transiente. Tentarei as dicas 1,2 e 3 do mestre Anthony Accioly e vamo ve oque consigo. Obrigado pela colaboração !!
Att
Lucas
GOSTEI 0
Lucas Costa

Lucas Costa

07/12/2011

Meus caros, problema resolvido e obrigado pela contribuição. O problema era mais simples que parceria, eu simplesmente por falta de atenção estava dando um new no objeto antes de atualizar, erro primário não acham?
Abraco.
GOSTEI 0
Robson Teixeira

Robson Teixeira

07/12/2011

acontece XD
e parabens por ter contado a solução e não esqueça de fechar o chamado ok?
GOSTEI 0
Lucas Costa

Lucas Costa

07/12/2011

Bem, nao sei como fechar chamado meu caro, preciso da sua orientação.
GOSTEI 0
Anthony Accioly

Anthony Accioly

07/12/2011

Bem, nao sei como fechar chamado meu caro, preciso da sua orientação.


Após uma resposta qualquer (como essa minha) aparece a opção para fechar.

Abraços,
GOSTEI 0
Lucas Costa

Lucas Costa

07/12/2011

Desculpe mais nao vi a opcao -fechar- onde deveria aparecer? devo ir no meu dev space ou no meu perfil?
GOSTEI 0
Dyego Carmo

Dyego Carmo

07/12/2011

Opa !

Resolvido ? Se sim , poderia fechar o chamado ?


Valeu !
GOSTEI 0
Lucas Costa

Lucas Costa

07/12/2011

NAO ENCONTREI NENHUMA OPCAO FECHAR, ONDE ESTA ISSO PELO AMOR DE DEUS !!!
GOSTEI 0
Dyego Carmo

Dyego Carmo

07/12/2011

Está do ladinho do status , porem vc deve estar logado para tal :)
GOSTEI 0
POSTAR