[Resolvido] Hibernate faz muitas consultas. É normal? Ou há algo errado?

10 respostas
M

Olá Pessoal,

estou desenvolvendo uma aplicação para o meu TCC e venho dando uma minerada nas consultas ao BD pois a persistência apresenta uma lentidão incomum em alguns casos.

Estou desenvolvendo minha aplicação com Hibernate + Mysql, inclusive inseri o c3p0, porém não há necessidade do mesmo visto que minha aplicação será executada apenas em um desktop.

O problema é o seguinte, eu ativei a seguinte propriedade no meu hibernate.cfg.xml:
true
Assim posso visualizar as consultas feitas pelo hibernate enquanto a aplicação é executada, o problema é que há consultas de mais sendo feitas pelo hibernate e não por mim, como no exemplo do código abaixo:

Linha de código na qual faço apenas uma consulta:
Obs: Só para realizar este teste, criei um contador na classe AbstractDAO para contar cada vez que iniciava/reiniciava uma sessão. No resultado será possível ver que só reiniciei uma sessão uma única vez entre todas essas consultas feitas pelo hibernate.

System.out.println("TESTE14");
            System.out.println("AbstractDAO Contador = " + AbstractDAO.contador);
            //Verifica se System User já tem seus acessos configurados
            List<Acessos> listAcessos = AbstractDAO.consultar("Acessos", "idAgente=" + user.getIdAgente());

            System.out.println("AbstractDAO Contador = " + AbstractDAO.contador);
            System.out.println("TESTE141");

Resultado, ou seja, todas as consultas feitas entre o tempo em que imprimi TESTE14 até TESTE141 (gerado pelo código acima):
Obs: Na minha opnião era pra ter feito apenas uma consulta.

TESTE14
AbstractDAO Contador = 2
Hibernate: select acessos0_.idAcesso as idAcesso12_, acessos0_.idAgente as idAgente12_, acessos0_.idPermissao as idPermis3_12_, acessos0_.acesso as acesso12_ from smid_server.acessos acessos0_ where idAgente=1
Hibernate: select agente0_.idAgente as idAgente4_0_, agente0_.codigo as codigo4_0_, agente0_.nome as nome4_0_, agente0_.ativo as ativo4_0_, agente0_.login as login4_0_, agente0_.senha as senha4_0_, agente0_.dataNascimento as dataNasc7_4_0_, agente0_.telefone as telefone4_0_, agente0_.dataCadastro as dataCada9_4_0_, agente0_.horaCadastro as horaCad10_4_0_ from smid_server.agente agente0_ where agente0_.idAgente=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select permissao0_.idPermissao as idPermis1_7_0_, permissao0_.nome as nome7_0_ from smid_server.permissao permissao0_ where permissao0_.idPermissao=?
Hibernate: select transacaoa0_.idagente as idagente1_, transacaoa0_.idTransacaoAgente as idTransa1_1_, transacaoa0_.idTransacaoAgente as idTransa1_11_0_, transacaoa0_.idagente as idagente11_0_, transacaoa0_.nomeTransacao as nomeTran3_11_0_, transacaoa0_.data as data11_0_, transacaoa0_.hora as hora11_0_ from smid_server.transacaoagente transacaoa0_ where transacaoa0_.idagente=?
Hibernate: select boletimtra0_.idAgente as idAgente1_, boletimtra0_.idBoletimTratamento as idBoleti1_1_, boletimtra0_.idBoletimTratamento as idBoleti1_5_0_, boletimtra0_.idAgente as idAgente5_0_, boletimtra0_.idLocalidade as idLocali3_5_0_, boletimtra0_.idMunicipio as idMunici4_5_0_, boletimtra0_.coordenadorRegional as coordena5_5_0_, boletimtra0_.grs as grs5_0_, boletimtra0_.categoria as categoria5_0_, boletimtra0_.turma as turma5_0_, boletimtra0_.data as data5_0_, boletimtra0_.semanaEpid as semanaEpid5_0_, boletimtra0_.numeroAtividade as numeroA11_5_0_, boletimtra0_.tipoAtividade as tipoAti12_5_0_, boletimtra0_.sincronizadoEm as sincron13_5_0_, boletimtra0_.ativo as ativo5_0_ from smid_server.boletimtratamento boletimtra0_ where boletimtra0_.idAgente=?
Hibernate: select acessoses0_.idAgente as idAgente1_, acessoses0_.idAcesso as idAcesso1_, acessoses0_.idAcesso as idAcesso12_0_, acessoses0_.idAgente as idAgente12_0_, acessoses0_.idPermissao as idPermis3_12_0_, acessoses0_.acesso as acesso12_0_ from smid_server.acessos acessoses0_ where acessoses0_.idAgente=?
Hibernate: select boletimpes0_.idAgente as idAgente1_, boletimpes0_.idBoletimPesquisa as idBoleti1_1_, boletimpes0_.idBoletimPesquisa as idBoleti1_9_0_, boletimpes0_.idAgente as idAgente9_0_, boletimpes0_.idLocalidade as idLocali3_9_0_, boletimpes0_.idMunicipio as idMunici4_9_0_, boletimpes0_.coordenadorRegional as coordena5_9_0_, boletimpes0_.grs as grs9_0_, boletimpes0_.categoria as categoria9_0_, boletimpes0_.turma as turma9_0_, boletimpes0_.data as data9_0_, boletimpes0_.semanaEpid as semanaEpid9_0_, boletimpes0_.numeroAtividade as numeroA11_9_0_, boletimpes0_.liAmostra as liAmostra9_0_, boletimpes0_.tipoAtividade as tipoAti13_9_0_, boletimpes0_.sincronizadoEm as sincron14_9_0_, boletimpes0_.ativo as ativo9_0_ from smid_server.boletimpesquisa boletimpes0_ where boletimpes0_.idAgente=?
AbstractDAO Contador = 3
TESTE141

Método de consulta na classe AbstractDAO:

public static List consultar(String nomeObjeto, String condicao) {

        try {
            inicializaSessao();
            transacao = sessao.beginTransaction();
            List list = sessao.createQuery("from " + nomeObjeto + " where " + condicao).list();

            return list;

        } catch (Exception er) {

            er.printStackTrace();
            return null;

        } finally {
            fechaSessao();
        }
    }

10 Respostas

J

Usa Criteria com fetch join pra query ficar uma só.

M

Olá javaflex,

você poderia me mostrar um exemplo de uma consulta assim? Pois quando quero fazer um join, uso a própria HQL.

D

maycon, precisamos de mais informações.
Se possível, poste as classes envolvidas no select e seus mapeamentos, caso tenha optado por xml.

E

O que o DRSMachado viu é uma coisa muito comum quando se está começando a usar Hibernate:

... "idAgente=" + user.getIdAgente() ...

e que lembra aquele jeito tosco de se usar SQL no JDBC (ou seja, sem PreparedStatements).

Esse tipo de consulta está gritando desesperadamente para usar Criteria. Um exemplo disso vai em:

http://www.javalobby.org/articles/hibernatequery102/

M

Essa é minha classe DAO Abstrata:

package persistencia.dao;

import java.util.ArrayList;
import persistencia.session.hibernateSessionFactory;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Projections;

/**
 *
 * @author Maycon Fernando Silva Brito @email [email removido]
 */
public class AbstractDAO {

    protected static Session sessao = null;
    protected static Transaction transacao = null;
    public static Integer contador = 0;

    public static synchronized Session getSessao(){
        contador++;
        if(sessao != null && sessao.isOpen()) {
            fechaSessao();
            sessao = hibernateSessionFactory.getSession();
            
        } else {
            sessao = hibernateSessionFactory.getSession();
        }
        return sessao;
    }
    
    /**
     * Inicializa a sessao para efetuar as transacoes no banco de dados
     */
    protected static final void inicializaSessao() {
        sessao = getSessao();
    }

    /**
     * Fecha a sessao caso ela esteja aberta
     */
    public static boolean fechaSessao() {
        if (sessao.isOpen()) {
            sessao.flush();
            sessao.close();

            return true;
        }

        return false;
    }

    /**
     * Cadastra um unico objeto no banco de dados
     *
     * @param obj - Objetto a ser cadastrado
     * @return - @true se o objeto foi cadastrado, @false se o objeto nao foi
     * cadastrado
     */
    public static boolean cadastrar(Object obj) {
        try {

            inicializaSessao();
            transacao = sessao.beginTransaction();
            sessao.merge(obj);
            transacao.commit();

            return true;

        } catch (HibernateException er) {

            er.printStackTrace();
            transacao.rollback();

            return false;

        } finally {

            fechaSessao();

        }
    }

    /**
     * Altera um unico objeto no banco de dados
     *
     * @param obj - Objetto a ser alterado
     * @return - @true se o objeto foi alterado, @false se o objeto nao foi
     * alterado
     */
    public static boolean alterar(Object obj) {
        try {

            inicializaSessao();
            transacao = sessao.beginTransaction();
            sessao.merge(obj);
            transacao.commit();

            return true;

        } catch (HibernateException er) {

            er.printStackTrace();
            transacao.rollback();

            return false;

        } finally {
            fechaSessao();

        }
    }

    /**
     * Exclui um unico objeto no banco de dados
     *
     * @param obj - Objeto a ser excluido
     * @return - @true se o objeto foi excluido, @false se o objeto nao foi
     * excluido
     */
    public static boolean excluir(Object obj) {
        try {

            inicializaSessao();
            transacao = sessao.beginTransaction();
            sessao.delete(obj);
            transacao.commit();

            return true;

        } catch (HibernateException er) {

            er.printStackTrace();
            transacao.rollback();
            return false;

        } finally {
            fechaSessao();
        }
    }

    /**
     * Esclui um determinado objeto a partir unicamente do seu id
     *
     * @param nomeObjeto
     * @param nomeId
     * @param id
     * @return
     */
    public static boolean excluirPorId(String nomeObjeto, String nomeId, Integer id) {

        try {

            List obj = consultar(nomeObjeto, "" + nomeId + "=" + id);
            Object objeto = obj.get(0);
            if (!excluir(objeto)) {
                System.out.println("Não foi possível excluir o objeto " + nomeObjeto + " de Id " + id);
            }

            return true;

        } catch (IndexOutOfBoundsException er) {

            return true;

        } catch (Exception er) {

            er.printStackTrace();
            return false;

        }

    }

    /**
     * Consulta todos as instancias de um determinado objeto
     *
     * @param nomeObjeto - Nome dos objetos a serem consultados no banco de
     * dados
     * @return - Lista preenchida com as instancias do objeto no banco de dados,
     * @null caso exista alguma excecao
     */
    public static List listar(String nomeObjeto) {
        try {

            inicializaSessao();
            transacao = sessao.beginTransaction();
            List list = sessao.createQuery("from " + nomeObjeto).list();

            return list;

        } catch (HibernateException er) {

            er.printStackTrace();
            return null;

        } finally {

            fechaSessao();
        }
    }

    /**
     * Consulta um tipo de objetos do banco de dados a partir de uma determinada
     * condicao
     *
     * @param nomeObjeto - Nome dos objetos a serem consultados no banco de
     * dados
     * @param condicao - Condicao a ser satisfeita para realizar a consulta
     * @return - Lista preenchida com os objetos que satisfazem a condicao
     */
    public static List consultar(String nomeObjeto, String condicao) {

        try {
            inicializaSessao();
            transacao = sessao.beginTransaction();
            List list = sessao.createQuery("from " + nomeObjeto + " where " + condicao).list();

            return list;

        } catch (Exception er) {

            er.printStackTrace();
            return null;

        } finally {
            fechaSessao();
        }
    }

    /**
     * Realiza uma consulta puramente através do HQL
     *
     * @return
     */
    public static List consultar(String hql) {

        try {
            inicializaSessao();
            transacao = sessao.beginTransaction();
            List list = sessao.createQuery(hql).list();

            return list;

        } catch (Exception er) {

            er.printStackTrace();
            return null;

        } finally {
            fechaSessao();
        }
    }

    /**
     * Realiza uma listagem sem fechar a sessao
     *
     * @param nomeObjeto
     * @return
     */
    public static List listarSemFecharSessao(String nomeObjeto) {

        try {

            inicializaSessao();
            transacao = sessao.beginTransaction();
            List list = sessao.createQuery("from " + nomeObjeto).list();

            return list;

        } catch (Exception er) {

            er.printStackTrace();
            return null;

        }
    }

    /**
     * Realiza uma consulta sem fechar a sessao
     *
     * @param nomeObjeto
     * @param condicao
     * @return
     */
    public static List consultarSemFecharSessao(String nomeObjeto, String condicao) {

        try {
            
            List list = null;
            inicializaSessao();
            transacao = sessao.beginTransaction();
            if (nomeObjeto != null) {
                list = sessao.createQuery("from " + nomeObjeto + " where " + condicao).list();
            } else {
                list = sessao.createQuery(condicao).list();
            }

            return list;

        } catch (Exception er) {

            er.printStackTrace();
            return null;

        }
    }

    /**
     * Realiza a contagem de objetos na tabela
     *
     * @param nomeObjeto
     * @return
     */
    public static int count(Class classe) {
        try {
            inicializaSessao();
            Criteria criteria = sessao.createCriteria(classe);
            criteria.setProjection(Projections.rowCount());

            return ((Integer) criteria.list().get(0)).intValue();

        } catch (Exception er) {
            er.printStackTrace();
            transacao.rollback();
            return -1;

        } finally {

            sessao.flush();
            sessao.close();

        }
    }

    /**
     * Verifica qual o maior valor do atributo da classe no bd
     *
     * @param nomeObjeto
     * @return
     */
    public static int max(Class classe, String atributo) {
        try {
            inicializaSessao();
            Criteria criteria = sessao.createCriteria(classe);
            criteria.setProjection(Projections.max(atributo));

            if (((Integer) criteria.list().get(0)) != null) {
                return ((Integer) criteria.list().get(0)).intValue();
            } else {
                return 1;
            }



        } catch (Exception er) {
            er.printStackTrace();
            transacao.rollback();
            return -1;

        } finally {

            sessao.flush();
            sessao.close();

        }
    }

    public static Session getSession() {
        return sessao;
    }
}

Mapeamento da classe Agente:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 10/01/2012 17:36:01 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
    <class name="modelo.Agente" table="agente" catalog="smid_server">
        <id name="idAgente" type="java.lang.Integer">
            <column name="idAgente" />
            <generator class="identity" />
        </id>
        <property name="codigo" type="java.lang.Integer">
            <column name="codigo" not-null="true"/>
        </property>
        <property name="nome" type="string">
            <column name="nome" length="100" not-null="true" />
        </property>
        <property name="ativo" type="boolean">
            <column name="ativo" not-null="true" />
        </property>
        <property name="login" type="string">
            <column name="login" length="45" not-null="true" />
        </property>
        <property name="senha" type="string">
            <column name="senha" length="64" not-null="true" />
        </property>
        <property name="dataNascimento" type="date">
            <column name="dataNascimento" length="10" />
        </property>
        <property name="telefone" type="string">
            <column name="telefone" length="45" />
        </property>
        <property name="dataCadastro" type="date">
            <column name="dataCadastro" length="10" not-null="true" />
        </property>
        <property name="horaCadastro" type="time">
            <column name="horaCadastro" length="8" not-null="true" />
        </property>
        <set name="boletimpesquisas" inverse="true" fetch="select" lazy="false" cascade="all">
            <key>
                <column name="idAgente" not-null="true" />
            </key>
            <one-to-many class="modelo.Boletimpesquisa"/>
        </set>
        <set name="acessoses" inverse="true" fetch="select" lazy="false" cascade="all">
            <key>
                <column name="idAgente" not-null="true" />
            </key>
            <one-to-many class="modelo.Acessos"/>
        </set>
        <set name="boletimtratamentos" inverse="true" fetch="select" lazy="false" cascade="all">
            <key>
                <column name="idAgente" not-null="true" />
            </key>
            <one-to-many class="modelo.Boletimtratamento"/>
        </set>
        <set name="transacaoagentes" inverse="true" fetch="select" lazy="false" cascade="all">
            <key>
                <column name="idagente" not-null="true" />
            </key>
            <one-to-many class="modelo.Transacaoagente"/>
        </set>
    </class>
</hibernate-mapping>

Mapeamento da classe Acessos:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 10/01/2012 17:36:01 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
    <class name="modelo.Acessos" table="acessos" catalog="smid_server">
        <id name="idAcesso" type="java.lang.Integer">
            <column name="idAcesso" />
            <generator class="identity" />
        </id>
        <many-to-one name="agente" class="modelo.Agente"  fetch="select" lazy="false" cascade="all">
            <column name="idAgente" not-null="true" />
        </many-to-one>
        <many-to-one name="permissao" class="modelo.Permissao"  fetch="select" lazy="false" cascade="all">
            <column name="idPermissao" not-null="true" />
        </many-to-one>
        <property name="acesso" type="boolean">
            <column name="acesso" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

Se precisarem de mais classes é só pedir que posto aqui.

Pessoal, então eu terei de alterar minha classe DAO para utilizar Critéria em todas as querys possíveis?

D

Precisa mesmo do fetch em select? Creio que, optando por HQL, usar uns JOIN não seria nada mal.

M

drsmachado, então, dependendo da ocasião é melhor substituir todos os fetch=“select” possíveis por consultas hql com joins? Nesse caso não será necessário implementar o criteria em minhas consultas?

D

Você sempre tem várias opções de select. Desde o get, load, até um left outer join no criteria ou hql.
Agora, eu não vejo necessidade de usar os fetch. Não conheço a estrutura da aplicação, as regras de negócio são conhecidas por ti.
O que eu sugiro é que você faça é que use HQL e suas opções.
Pense no seguinte, se você seguisse o padrão JPA 2, que não tem criteria, como faria?

M

drsmachado, entanglement e javaflex,

você me ajudaram muito mesmo! Pois como é um projeto de TCC, terei que entregar pouco tempo após o fim da greve e já tinha um bom tempo que eu estava tentando solucionar este problema, alterei consultas, mapeamento, atualizei a versão do hibernate para 4.0, inseri c3p0 e nada do meu problema ser resolvido. Mas agora sim, vocês me salvaram, muito obrigado!

Será melhor pra mim só alterar as consultas que utilizam o mapeamento fetch para consultas com inner join, pois ainda teria uma curva de aprendizagem para o Critéria e como tenho que entregar o projeto rapidamente.

Abaixo a alteração no código e o novo resultado, vejam como o número de consultas feitas pelo hibernate reduziu de +/- 30 para apenas 2:

System.out.println("AbstractDAO Contador = " + AbstractDAO.contador);
            //Verifica se System User já tem seus acessos configurados
            List<Acessos> listAcessos = AbstractDAO.consultar("from Acessos a inner join fetch a.agente g where g.idAgente=" + user.getIdAgente());

            System.out.println("AbstractDAO Contador = " + AbstractDAO.contador);
            System.out.println("TESTE141");

OBS: retirei os devidos fetch="select" e lazy="false" do mapeamento hibernate das classes.
TESTE14
AbstractDAO Contador = 2
Hibernate: select acessos0_.idAcesso as idAcesso12_0_, agente1_.idAgente as idAgente4_1_, acessos0_.idAgente as idAgente12_0_, acessos0_.idPermissao as idPermis3_12_0_, acessos0_.acesso as acesso12_0_, agente1_.codigo as codigo4_1_, agente1_.nome as nome4_1_, agente1_.ativo as ativo4_1_, agente1_.login as login4_1_, agente1_.senha as senha4_1_, agente1_.dataNascimento as dataNasc7_4_1_, agente1_.telefone as telefone4_1_, agente1_.dataCadastro as dataCada9_4_1_, agente1_.horaCadastro as horaCad10_4_1_ from smid_server.acessos acessos0_ inner join smid_server.agente agente1_ on acessos0_.idAgente=agente1_.idAgente where agente1_.idAgente=1
Hibernate: select transacaoa0_.idagente as idagente1_, transacaoa0_.idTransacaoAgente as idTransa1_1_, transacaoa0_.idTransacaoAgente as idTransa1_11_0_, transacaoa0_.idagente as idagente11_0_, transacaoa0_.nomeTransacao as nomeTran3_11_0_, transacaoa0_.data as data11_0_, transacaoa0_.hora as hora11_0_ from smid_server.transacaoagente transacaoa0_ where transacaoa0_.idagente=?
AbstractDAO Contador = 3
TESTE141
J

mayconfsbrito:
drsmachado, entanglement e javaflex,

você me ajudaram muito mesmo! Pois como é um projeto de TCC, terei que entregar pouco tempo após o fim da greve e já tinha um bom tempo que eu estava tentando solucionar este problema, alterei consultas, mapeamento, atualizei a versão do hibernate para 4.0, inseri c3p0 e nada do meu problema ser resolvido. Mas agora sim, vocês me salvaram, muito obrigado!

Será melhor pra mim só alterar as consultas que utilizam o mapeamento fetch para consultas com inner join, pois ainda teria uma curva de aprendizagem para o Critéria e como tenho que entregar o projeto rapidamente.

Abaixo a alteração no código e o novo resultado, vejam como o número de consultas feitas pelo hibernate reduziu de +/- 30 para apenas 2:

System.out.println("AbstractDAO Contador = " + AbstractDAO.contador);
            //Verifica se System User já tem seus acessos configurados
            List<Acessos> listAcessos = AbstractDAO.consultar("from Acessos a inner join fetch a.agente g where g.idAgente=" + user.getIdAgente());

            System.out.println("AbstractDAO Contador = " + AbstractDAO.contador);
            System.out.println("TESTE141");

OBS: retirei os devidos fetch="select" e lazy="false" do mapeamento hibernate das classes.

TESTE14 AbstractDAO Contador = 2 Hibernate: select acessos0_.idAcesso as idAcesso12_0_, agente1_.idAgente as idAgente4_1_, acessos0_.idAgente as idAgente12_0_, acessos0_.idPermissao as idPermis3_12_0_, acessos0_.acesso as acesso12_0_, agente1_.codigo as codigo4_1_, agente1_.nome as nome4_1_, agente1_.ativo as ativo4_1_, agente1_.login as login4_1_, agente1_.senha as senha4_1_, agente1_.dataNascimento as dataNasc7_4_1_, agente1_.telefone as telefone4_1_, agente1_.dataCadastro as dataCada9_4_1_, agente1_.horaCadastro as horaCad10_4_1_ from smid_server.acessos acessos0_ inner join smid_server.agente agente1_ on acessos0_.idAgente=agente1_.idAgente where agente1_.idAgente=1 Hibernate: select transacaoa0_.idagente as idagente1_, transacaoa0_.idTransacaoAgente as idTransa1_1_, transacaoa0_.idTransacaoAgente as idTransa1_11_0_, transacaoa0_.idagente as idagente11_0_, transacaoa0_.nomeTransacao as nomeTran3_11_0_, transacaoa0_.data as data11_0_, transacaoa0_.hora as hora11_0_ from smid_server.transacaoagente transacaoa0_ where transacaoa0_.idagente=? AbstractDAO Contador = 3 TESTE141


Show de bola! O ideal é que fique um SQL só. O Fetch é necessário sim quando você tem propriedades lazy e quer que em algumas consultas ele anule o lazy pra vir num SQL só. Questão de usar HQL ou Criteria ou ainda de usar padrão JPA ou não vai do que cada equipe avaliar melhor, então dá uma lida sobre as duas formas e mais pra frente decide o que achar melhor.

Criado 3 de agosto de 2012
Ultima resposta 7 de ago. de 2012
Respostas 10
Participantes 4