hibernate: Could not synchronize database state with session  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
praa99
Smalltalk

Membro desde: 13/04/2005 10:12:24
Mensagens: 3
Offline

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...
mister__m
Virtual Machine Man
[Avatar]

Membro desde: 18/03/2005 16:13:17
Mensagens: 736
Offline

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.

Michael Nascimento Santos, aka Mister M

Summa Technologies do Brasil - http://www.summa-tech.com/
genesis: Uma nova forma de desenvolver aplicações - https://genesis.dev.java.net/
ThinNB: Suporte a Thinlet no NetBeans - https://thinnb.dev.java.net/
Líder da JSR-310 - Date and Time API
Expert Group Member das JSRs 207 (PD4J), 250 (Common Annotations), 270 (Java 2 SE 6.0), 296 (Swing Framework) e 303 (Bean Validation)
SouJava: Fortalecendo a comunidade Java brasileira - https://soujava.dev.java.net/ https://www.soujava.org.br/
JSR Community @ java.net - http://community.java.net/jsr
Blogs - http://blog.michaelnascimento.com.br/ http://today.java.net/pub/au/80
Twitter - @mr__m
[WWW]
legionarioba
JavaTeenager
[Avatar]

Membro desde: 24/03/2003 00:40:42
Mensagens: 171
Localização: Salvador
Offline

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

http://silvioluiz.wordpress.com
[Email] [MSN]
praa99
Smalltalk

Membro desde: 13/04/2005 10:12:24
Mensagens: 3
Offline

É 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
Virtual Machine Man
[Avatar]

Membro desde: 18/03/2005 16:13:17
Mensagens: 736
Offline

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.

Michael Nascimento Santos, aka Mister M

Summa Technologies do Brasil - http://www.summa-tech.com/
genesis: Uma nova forma de desenvolver aplicações - https://genesis.dev.java.net/
ThinNB: Suporte a Thinlet no NetBeans - https://thinnb.dev.java.net/
Líder da JSR-310 - Date and Time API
Expert Group Member das JSRs 207 (PD4J), 250 (Common Annotations), 270 (Java 2 SE 6.0), 296 (Swing Framework) e 303 (Bean Validation)
SouJava: Fortalecendo a comunidade Java brasileira - https://soujava.dev.java.net/ https://www.soujava.org.br/
JSR Community @ java.net - http://community.java.net/jsr
Blogs - http://blog.michaelnascimento.com.br/ http://today.java.net/pub/au/80
Twitter - @mr__m
[WWW]
legionarioba
JavaTeenager
[Avatar]

Membro desde: 24/03/2003 00:40:42
Mensagens: 171
Localização: Salvador
Offline

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

This message was edited 1 time. Last update was at 13/04/2005 15:39:29


http://silvioluiz.wordpress.com
[Email] [MSN]
praa99
Smalltalk

Membro desde: 13/04/2005 10:12:24
Mensagens: 3
Offline

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,
 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team