Hibernate: Could not synchronize database state with session

6 respostas
P

Estou com um problema que não consigo solucionar:

O método faz uma serie de operações de delete em tabelas. Mas um dos registros que deve ser deletado esta em uma tabela que tem relacionamento com outras tabelas, mas q tambem estou deletando na mesma transação. Resumindo, quando o método que executo chama o session.flush(), me retorna o seguinte erro.

SEVERE: Could not synchronize database state with session
net.sf.hibernate.HibernateException: SQL insert, update or delete failed (row not found)

Alguém pode me ajudar? Obrigado…

6 Respostas

mister_m

Diga qual versão do Hibernate você está utilizando, a ordem em que você está excluindo as entidades e o mapeamento dos relacionamentos entre elas.

legionarioba

Não me recordo bem agora, mas veja nos seus mapeamentos o uso dos atributos inverse e do cascade tb, provavelmente na primeira exclusão que você está executando já estejam sendo deletados os registros relacionados que você referencia em algum delete posterior…

[]'s

P

É mais ou menos assim:
Tres entidades X, Y e Z
Y é um atributo da entidade X e Z é um atributo da entidade Y.
Primeiro eu faço session.delete(objsZ)
Depois, session.delete(objsY) e por ultimo session.delete(objX).
No session.flush(), ocorre o erro que mencionei.

Mas quando eu comento o ultimo session.delete (do obj X), deleta-se normalmente das outras duas tabelas e não ocorre o erro.

no mapeamento dos relacionamentos, os atributos estão inverse=“true” e cascade=“all-delete-orphan”, para todos os relacionamentos.

Não sei se esclareci meu problema…

mister_m

Se entendi direito sua explicação, acho que você precisa, antes de chamar o delete, desfazer a associação entre as entidades na mão. Não lembro como o all-delete-orphan, mas acho que um delete na instância de X diretamente deveria funcionar também pra algumas opções de cascade.

legionarioba

Procure a revista MundoJava que vem falando sobre Hibernate(não me recordo bem qual o número…) , ela fala bem sobre esse inverse. Significa que quem controla a transação, no caso, quem na prática persiste, é aquele que possui inverse=false. Não me lembro bem como é o comportamento pra delete, mas tente o seguinte:

  1. Dê um load nos objetos Y e Z, adicione esses objetos ao X :
    y.addZ(meuZ)
    x.addY( meuY), e ai execute o delete pra X

  2. Apenas altere o inverse pra false. e execute o código como você escreveu

Dica: Use o Log4j pra dar uma olhada no console nas querys geradas pelo Hibernate

Poste o resultado !

[]'s

P

Só agora tive tempo de responder… Peço desculpas…
Então, peguei a revista q vc falou mas lah nao explica mundo bem nao, fala bem pouca coisa sobre isso…
Tentei seguir tua dica tbem e nada…
Acabei deixando sem transacao…

Agora estou com outro problema:
Toda vez q faço a primeira consulta ao BD após o Tomcat ser ‘startado’, aparece entre as mensagens uma que é a seguinte:

INFO: Not binding factory to JNDI, no JNDI name configured

o q fazer? Se alguem puder ajudar, agradeço!!

valeu,

Criado 13 de abril de 2005
Ultima resposta 25 de abr. de 2005
Respostas 6
Participantes 3