Log do Hibernate

10 respostas
Psycopata

Existe alguma forma de logar o hibernate de forma eficiente?

Eu estou preso num erro: org.hibernate.exception.SQLGrammarException: could not execute query e não consigo descobrir o que está gerando esse erro.

O mapeamento do bean e do arquivos hbm.xml estão correto e coerente com o banco.
O bean que mapeia o banco implementa o serializable; os nomes dos atributos estão corretos. Até refiz a tabela do banco de dados mudando os small int para int para ver se tenho algum resultado e nada.

Pois é, preciso saber o que está acontecendo. Existe alguma forma de logar isso?

10 Respostas

Psycopata

Poxa, ninguém?

alguém pelo menos tem idéia do que está gerenado o org.hibernate.exception.SQLGrammarException: could not execute query?

Bom, se ajudar, vou publicar alguns dados:

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
    <!-- Database connection settings -->
        <property name="connection.driver_class">COM.ibm.db2.jdbc.app.DB2Driver</property>
        <property name="connection.url">jdbc:db2:DINFODE2</property>
        <property name="connection.username">db2admin</property>
        <property name="connection.password">dinfodev2</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.DB2Dialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>
        
        <property name="hibernate.jdbc.batch_size">30</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="org.hibernate">true</property>
        
        <mapping resource="br/com/bb/sigov/sinergia8/RankingBean.hbm.xml"/>
        <mapping resource="br/com/bb/sigov/sinergia8/AtbBean.hbm.xml"/>
        <mapping resource="br/com/bb/sigov/sinergia8/FocoBean.hbm.xml"/>
        <mapping resource="br/com/bb/sigov/sinergia8/TotaisBean.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

atbBean.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="br.com.bb.sigov.sinergia8.AtbBean" table="DB2ATB.ATB">
        <composite-id>
            <key-property name="cd_prf_depe"    column="CD_PRF_DEPE"/>
            <key-property name="aa_ref"         column="AA_REF"/>
            <key-property name="mm_ref"         column="MM_REF"/>
            <key-property name="prsp"           column="PRSP"/>
        </composite-id>
            <property name="pto_mm"             column="PTO_MM"/>
            <property name="pto_smt"            column="PTO_SMT"/>
            <property name="peso"               column="PESO"/>
            <property name="pto"                column="PTO"/>
    </class>
</hibernate-mapping>

o bean que mapeia a tabela do banco:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.bb.sigov.sinergia8;

import java.io.Serializable;

/**
 *
 * @author f9343091
 */
public class AtbBean implements Serializable
{
    private int cd_prf_depe;
    private int aa_ref;
    private int mm_ref;
    private String prsp;
    private int pto_mm;
    private int pto_smt;
    private int peso;
    private int pto;
    
    public AtbBean()
    {
    }

    public int getCd_prf_depe()
    {
        return cd_prf_depe;
    }

    public void setCd_prf_depe(int cd_prf_depe)
    {
        this.cd_prf_depe = cd_prf_depe;
    }

    public int getAa_ref()
    {
        return aa_ref;
    }

    public void setAa_ref(int aa_ref)
    {
        this.aa_ref = aa_ref;
    }

    public int getMm_ref()
    {
        return mm_ref;
    }

    public void setMm_ref(int mm_ref)
    {
        this.mm_ref = mm_ref;
    }

    public String getPrsp()
    {
        return prsp;
    }

    public void setPrsp(String prsp)
    {
        this.prsp = prsp;
    }

    public int getPto_mm()
    {
        return pto_mm;
    }

    public void setPto_mm(int pto_mm)
    {
        this.pto_mm = pto_mm;
    }

    public int getPto_smt()
    {
        return pto_smt;
    }

    public void setPto_smt(int pto_smt)
    {
        this.pto_smt = pto_smt;
    }

    public int getPeso()
    {
        return peso;
    }

    public void setPeso(int peso)
    {
        this.peso = peso;
    }

    public int getPto()
    {
        return pto;
    }

    public void setPto(int pto)
    {
        this.pto = pto;
    }
    
}

treço de código que realiza a consulta:

public AtbBean [] getAtbPerspectiva()
    {
        List<AtbBean> lst = new ArrayList();
        String sql = sqlAtbPerspectiva( false );
        
        try
        {
            Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
            sessao.beginTransaction();
            lst = sessao.createSQLQuery(sql).addEntity( AtbBean.class).list();
            sessao.getTransaction().commit();
        }
        catch(Exception e)
        {
            log.addLog("erro ao Processar os valores do Atb: " + e);
        }
        
        return formataAtb( (AtbBean[])lst.toArray( new AtbBean[0]) );
    }

e ai, o que pode está contecendo?

maiconramones

Bom primeiramente poste o que faz o método sqlAtbPerspectiva…

Segundo poderia postar o stack completo…

Esse erro acontece quando há erro gramatical na tua query sql por isso é importante postar o teu método.

Abraço,

U

Bixo, não olhei teu código, mas para o hibernate usa o Log4J para log. Inclusive na pasta /etc da distribuição vem com o log4j.properties já todo configurado para um bom debug.

Use tbm as propriedades “hibnernate.show_sql” e “hibernate.format_sql” no seu hibernate.cfg.xml, ou equivalente… :wink:

t+

Psycopata

No saco do método sqlAtbPerspectiva, faz isso:

private String sqlAtbPerspectiva( boolean todos )
    {
        String sql = "";
        sql += " select cd_prf_depe, aa_ref, mm_ref, prsp, pto_mm, pto_smt, pto from db2atb.atb ";
        sql += " where cd_prf_depe = "+depe+" and aa_ref = "+ano+" and mm_ref = "+mes+" ";
        if (todos == true)
            sql += " prsp like TOTAL ";
        
        log.addLog("Sql ATB: " + sql);
        return sql;
    }

O código sql retirado do log é:

Hibernate: 
    select
        cd_prf_depe,
        aa_ref,
        mm_ref,
        prsp,
        pto_mm,
        pto_smt,
        pto 
    from
        db2atb.atb  
    where
        cd_prf_depe = 8 
        and aa_ref = 2008 
        and mm_ref = 2

E esse código FUNCIONA perfeitamente quando mando executar no banco.

Qua ao erro, essa é a linha que aparece no log: Sql ATB: select cd_prf_depe, aa_ref, mm_ref, prsp, pto_mm, pto_smt, pto from db2atb.atb where cd_prf_depe = 8 and aa_ref = 2008 and mm_ref = 2 erro ao Processar os valores do Atb: org.hibernate.exception.SQLGrammarException: could not execute query

Não aparece erro nenhuma na tela pq o objeto devolvido é nulo e então o tomcat renderiza a tela com nada.

O código sql que gera a tabela no banco é esse:

CREATE TABLE DB2ATB.ATB 
(
   CD_PRF_DEPE          INTEGER NOT NULL,
   AA_REF               INTEGER NOT NULL,
   MM_REF               INTEGER NOT NULL,
   PRSP                 VARCHAR(40) NOT NULL,
   PTO_MM               INTEGER,
   PTO_SMT              INTEGER,
   PESO                 INTEGER,
   PTO                  INTEGER
)
   IN ATB
;
ALTER TABLE DB2ATB.ATB
   ADD PRIMARY KEY (CD_PRF_DEPE, AA_REF, MM_REF, PRSP);
Leozin

Thiago

só uma dúvida: esse código funciona?

private String sqlAtbPerspectiva( boolean todos ) { String sql = ""; sql += " select cd_prf_depe, aa_ref, mm_ref, prsp, pto_mm, pto_smt, pto from db2atb.atb "; sql += " where cd_prf_depe = "+depe+" and aa_ref = "+ano+" and mm_ref = "+mes+" "; if (todos == true) sql += " prsp like TOTAL "; log.addLog("Sql ATB: " + sql); return sql; }

Psycopata

Leozin:
Thiago

só uma dúvida: esse código funciona?

private String sqlAtbPerspectiva( boolean todos ) { String sql = ""; sql += " select cd_prf_depe, aa_ref, mm_ref, prsp, pto_mm, pto_smt, pto from db2atb.atb "; sql += " where cd_prf_depe = "+depe+" and aa_ref = "+ano+" and mm_ref = "+mes+" "; if (todos == true) sql += " prsp like TOTAL "; log.addLog("Sql ATB: " + sql); return sql; }

Essa função gera o código sql que fará a pesquisa no banco. É o códgio que postei (naõ o que cria a tabela, o da consulta).

As variáveis, sáo variáveis globais da classe, setadas pelo jsf.

PS. não postei antes por indisponibilidade da rede

Psycopata

toc toc toc???

Leozin

mas esse código tá funcionando?!

Psycopata

Eu descobri o problema.

Depois, quando eu tirei o hibernate e coloquei os meus métodos que faz o que o hibernate faz, eu tive a resposta.

O problema é que na pesquisa ficou faltando um dos campos da tabela.

Bom, sobre isso, eu gostaria de saber se esse tipo de erro apareceria no log4j, porque caso contrário, eu posso afirmar: o hibernate é uma bela porcaria.

Eu fiz alguns métodos que executam pesquisas e preenche os beans, e os meus métodos logam os erros.

No caso, o erro que surgiu no meu log foi: campo Peso, tipo int: coluna inválida.

Poxa vida, foi só ver isso para eu resolver o problema. Como imaginei que poderia ser o mesmo problema no hibernate, eu peguei a classe original e consertei o sql e olha, funcionou.

O que tem no meu log que não tem no hibernate e que preciso é : log de erro no nível de campo da tabela; impressão do código sql gerado MESMO EM CASO DE ERRO, e os erros devolvidos pelo banco de dados.
Se no log4j o hibernate não me der esse detalhamento, então eu não vou mais usar hibernate, pq perder um dia intereiro para tentar descobrir que diabos é essa mensagem retardada de erro de gramática eu acho um pouco absurdo.

Aproveitando, alguém já configurou o log4j para o tomcat6? Eu tentei configurar aki mas ele não está funcionando. Os tutoriais que eu achei vão até o 5 (pensei que a configuração fosse a mesma, mas pelo jeito não é).

Eu preciso saber até onde vai o detalhamento do log do hibernate com o log4j. Porque caso não chegue no nível do meu, infelizmente não será possível utilizar o hibertane e perder um dia inteiro em um erro por causa de logs porcamente genéricos.

Psycopata

Oba, consegui fazer o log4j rodar no tomcat6.

Bom, e o log4j pega o erro que o hibernate omitiu.

Infelismente, ele não me fala qual coluna deu o erro, como acontece com o meu, mas com isso já dá para trabalhar

:slight_smile:

Não era possível o hibernate naõ ter essa ferramenta.

Criado 18 de março de 2008
Ultima resposta 19 de mar. de 2008
Respostas 10
Participantes 4