[Hibernate] Problema em Inserção de objeto dependente  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
Cocota
JavaChild
[Avatar]

Membro desde: 03/04/2006 21:17:41
Mensagens: 149
Localização: Natal-RN
Offline

Olá a todos, vim em busca de help.

Tô fora de casa, vou só introduzir o problema. Quando chegar eu boto os códigos de erro e os mapeamentos e tal.

O sistema controla projetos. Um projeto depende de um responsavel. (responsavel 1 : n projetos).

Eu tô inserindo um responsavel beleza.
Mas na hora de inserir um projeto, eu seleciono o responsavel, dou um setResponsavel e depois mando persistir o objeto projeto no banco. Me retorna um erro.

(org.hibernate...) .SQLGrammarException diz que acontece um erro por não conseguir fazer update em batch.

Alguma idéia inicial?

Ez RulEz Até de Madrugada
[WWW] [MSN]
Filipe Sabella
GUJ Expert

Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline

Pode postar o stacktrace todo, a parte do código pertinente e os mapeamentos de ambas as classes?

Former LIPE.
[ICQ]
Cocota
JavaChild
[Avatar]

Membro desde: 03/04/2006 21:17:41
Mensagens: 149
Localização: Natal-RN
Offline

Vamo la,

Responsavel.hbm.xml

Projeto.hbm.xml


Erro 505
type Exception Report

exception
javax.servlet.ServletException: Could not execute JDBC batch update
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:523)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)

root cause
org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:59)
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:181)
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:226)
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:136)
org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)
org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730)
org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:324)
org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
/* Essas tres abaixo são classes minhas */
br.rn.cefet.nudes.modelo.percistencia.GenericDAO.executeOperacao(GenericDAO.java:59)
br.rn.cefet.nudes.modelo.negocio.Cadastrador.execute(Cadastrador.java:26)
br.rn.cefet.nudes.view.struts.action.CadastroProjetoAction.execute(CadastroProjetoAction.java:29)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)

Código da classe CadastroProjetoAction


Código Classe Cadastrador


Código Classe GenericDAO


Meu problema é não ter nem noção do que significa esse erro.
Nem noção.

Ez RulEz Até de Madrugada
[WWW] [MSN]
Cocota
JavaChild
[Avatar]

Membro desde: 03/04/2006 21:17:41
Mensagens: 149
Localização: Natal-RN
Offline

Lendo outros topicos do Fórum do GUJ. Eu achei um que dava uma dica para setar a propriedade no hibernate.cfg.xml

Já fiz isso, o erro mudou, e eu não entendi nada novamente.

exception

javax.servlet.ServletException: could not insert: [br.rn.cefet.nudes.modelo.vo.Projeto]
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:523)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)


root cause

org.hibernate.exception.SQLGrammarException: could not insert: [br.rn.cefet.nudes.modelo.vo.Projeto]
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:59)
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1869)
org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:2200)
org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:46)
org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:223)
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:136)
org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)
org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730)
org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:324)
org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
br.rn.cefet.nudes.modelo.percistencia.GenericDAO.executeOperacao(GenericDAO.java:60)
br.rn.cefet.nudes.modelo.negocio.Cadastrador.execute(Cadastrador.java:26)
br.rn.cefet.nudes.view.struts.action.CadastroProjetoAction.execute(CadastroProjetoAction.java:29)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)


Também já mudei o método .save() para .saveOrUpdate() também não consigo persistir o objeto. O erro é igual ao primeiro listado aqui.

Ez RulEz Até de Madrugada
[WWW] [MSN]
takeshi10
Java Ninja

Membro desde: 08/08/2004 23:05:25
Mensagens: 254
Localização: Brasil
Offline

verifique se o Dialect setado eh o correto para o seu banco...

takeshi
Cocota
JavaChild
[Avatar]

Membro desde: 03/04/2006 21:17:41
Mensagens: 149
Localização: Natal-RN
Offline

takeshi,
Meu banco é o PostgreSQL 8.1
Esse é o dialeto escolhido e configurado no cfg.xml


Eu não acho que seja esse erro porque eu consigo inserir o objeto Responsavel.


Ez RulEz Até de Madrugada
[WWW] [MSN]
Filipe Sabella
GUJ Expert

Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline

Você está fazendo corretamente ao setar o responsável antes de salvar o projeto.

O código e o mapeamento parecem corretos, o que falta agora é o SQL gerado pelo Hibernate. O erro mostrado poderia ser melhor, mas o que foi mostrado é suficiente para deduzir que o problema ocorre na fase final: a excecução da query.

Então se o SQL não está sendo mostrado no console, adicione essa linha em seu log4j.properties:

Former LIPE.
[ICQ]
Cocota
JavaChild
[Avatar]

Membro desde: 03/04/2006 21:17:41
Mensagens: 149
Localização: Natal-RN
Offline

LIPE,

Vamo continuar que o papo tá bom.
O ShowSQL tá TRUE. Não tem erro nele.

Na sexta-feira de 17:30 eu troquei de SGBD. Botei o MySQL e junto com ele troquei o hibernate.cfg.xml por um que eu tinha pronto aqui. De primeira funcionou!
De cara eu culpei o hibernate-configuration que eu tava usando.
Vou colocar os dois aqui pra discutir em cima:
Antigo

Atual

Ez RulEz Até de Madrugada
[WWW] [MSN]
Filipe Sabella
GUJ Expert

Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline

Não importa se o show_sql é true ou false. Se você configura o logger para imprimir apenas WARN e não DEBUG, o sql não é mostrado.

Se ao mudar de banco funcionou então há algum problema no PostgreSQLDialect que seria encontrado ao olharmos o sql gerado

Former LIPE.
[ICQ]
Cocota
JavaChild
[Avatar]

Membro desde: 03/04/2006 21:17:41
Mensagens: 149
Localização: Natal-RN
Offline

Saquei Saquei....

foi mal... jurava ter visto ShowSQL=FALSE no seu post.

e os arquivos cfg.xml nao tem nada a ver?

Ez RulEz Até de Madrugada
[WWW] [MSN]
Filipe Sabella
GUJ Expert

Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline

Se só de trocar o banco e dialect resolveu, a priori tem nada a ver.

É bem improvável que seja um bug no Hibernate. É bem provável que você tenha cometido algum erro ao montar o banco de dados no MySQL. Alguma coluna com nome diferente ou qualquer coisa assim. Se pegar a query gerada e executá-la diretamente no banco de dados fica fácil pegar o erro.

Former LIPE.
[ICQ]
rafaelglauber
GUJ Master
[Avatar]

Membro desde: 07/09/2007 23:05:20
Mensagens: 1065
Localização: Feira de Santana
Offline

Estou utilizando hibernate com annotations, tive que realizar a seguinte mudança para funcionar corretamente com postgresql: Na anotação @Column eu coloquei o nome da coluna entre ``, exemplo:@Column(name="`password`"). A partir dessa mudança tudo funcionou corretamente, inclusive no próprio nome da entidade fiz o mesmo procedimento na anotação correspondente. Creio que o principio do problema seja o mesmo, logo que faça o mesmo em seu arquivo de mapeamento acredito que irá funcionar.
brancoisrael
What is classpath?

Membro desde: 10/10/2007 13:00:00
Mensagens: 8
Offline

Como vc esta fazendo para gerar a chave primária do Postgre? Creio que o seu problema esta ai, veja como a anotation @TableGenerator funciona que eu acho que vc vai resolver o seu problema com o Postgre.
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team