Erro ao consultar dados no Hibernate

4 respostas
jfnando

Alguem sabe pq dá esse erro?

Hibernate: /* from Conta order by codigo */ select conta0_.CODIGO as CODIGO, conta0_.DESCRICAO as DESCRICAO0_, conta0_.USUARIO as USUARIO0_ from CONTA conta0_ order by conta0_.CODIGO
org.hibernate.impl.SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]] ActionQueue[insertions=[] updates=[] deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[]])
05/06/2006 23:08:52 org.hibernate.LazyInitializationException <init>
SEVERE: could not initialize proxy - the owning Session was closed
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed

tipo, quando consulta de uma tabela q nao tem chave estrangeira dá certo. Mas nesse caso q a tabela tem chave estrangeira tah dando erro.

Aguardo sugestões, obrigado!!

4 Respostas

kaique

O que pode estar acontecendo eh o seguinte:
Se tu tiver colocado o relacionamento dessa entidade como lazy, o hibernate so vai atras das informações do relacionamento qd tu der um get em algum atributo da entidade do relacionamento. No caso, vc deve ter fechado a sessão logo depois q trouxe o objeto que queria…mas qd vc der o get no atributo do relacionamento, o hibernate precisa da sessão aberta para poder ir buscar no banco os valores do relacionamento lazy.
Bom, axo q eh isso q tah acontecendo, senão tenta explicar melhor ai a situação…
Vlw!

Leandro_BSB

A sessão estava fechada no momento da requisição.

[]s

LEandro

jfnando

é isso ai galera, eu estava fechando a sessao quando buscava as informações no banco de dados. Valeu

jfnando

Olha só galera, tah complicado mexer com esse tal de Hibernate. Seguinte…

-> tenho a classe HibernateUtility que circula pelo GUJ ai blz
-> tenho uma classe que chamad os metodos para gravar, atualziar, deletar e consultar

mas estou com problemas na hora de gravar/atualizar. O código do HibernateUtility está assim:

package jfinances.model.dao;

//~--- non-JDK imports --------------------------------------------------------

import javax.naming.ConfigurationException;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

//~--- classes ----------------------------------------------------------------

public class HibernateUtility
{
    private static final ThreadLocal<Session> threadSession =
            new ThreadLocal<Session>()
    {
        @Override protected Session initialValue ()
        {
            return sessionFactory.openSession ();
        }
    };
    protected static final SessionFactory sessionFactory;
    
    //~--- static initializers ------------------------------------------------
    
    static
    {
        try
        {
            Configuration cfg = new Configuration ();
            sessionFactory = cfg.configure ().buildSessionFactory ();
        }
        catch (Throwable ex)
        {
            // Make sure you log the exception, as it might be swallowed
            System.err.println ("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError (ex);
        }
    }
    
    //~--- methods ------------------------------------------------------------
    
    /**
     * Inicia uma transação na sessão do thread atual.
     */
    public static Transaction beginTransaction () throws HibernateException
    {
        return getSessaoDoThread ().beginTransaction ();
    }
    
    /**
     * Faz commit na transação passada.
     */
    public static void commitTransaction (Transaction trans)
    throws HibernateException
    {
        try
        {
            if ((trans != null) &&!trans.wasCommitted ()
            &&!trans.wasRolledBack ())
            {
                trans.commit ();
            }
        }
        catch (HibernateException ex)
        {
            rollbackTransaction (trans);
            
            throw new HibernateException (ex.getMessage ());
        }
    }
    
    /**
     * Desconecta a sessao do thread atual.
     */
    public static void desconectarSessao ()
    {
        Session session = threadSession.get ();
        
        if (session != null)
        {
            if (session.isConnected () && session.isOpen ())
            {
                session.disconnect ();
            }
        }
    }
    
    /**
     * Fecha sessão associada ao thread atual.
     */
    public static void fecharSessao () throws HibernateException
    {
        Session s = threadSession.get ();
        
        threadSession.set (null);
        
        if ((s != null) && s.isOpen ())
        {
            s.close ();
        }
    }
    
    /**
     * Reconecta a sessao do hibernate do thread atual.
     */
    public static void reconectar ()
    {
        Session session = threadSession.get ();
        
        if (session != null)
        {
            if (!session.isConnected ())
            {
                session.reconnect ();
            }
        }
    }
    
    /**
     * Faz rollback na transação.
     */
    public static void rollbackTransaction (Transaction trans)
    throws HibernateException
    {
        try
        {
            if ((trans != null) &&!trans.wasCommitted ()
            &&!trans.wasRolledBack ())
            {
                trans.rollback ();
            }
        }
        catch (HibernateException ex)
        {
            throw new HibernateException (ex.getMessage ());
        }
        finally
        {
            fecharSessao ();
        }
    }
    
    //~--- get methods --------------------------------------------------------
    
    public static Session getSessaoDoThread () throws HibernateException
    {
        Session s = threadSession.get ();
        
        if (s == null)
        {
            s = sessionFactory.openSession ();
            threadSession.set (s);
        }
        System.err.println (s.toString ());
        return s;
    }
    
    /**
     * @return Abre uma nova sessão do hibernate.
     * @throws HibernateException
     */
    public static Session getSession () throws HibernateException
    {
        Session session = null;
        try
        {
            session = sessionFactory.openSession ();
        }
        catch (HibernateException e)
        {
            throw new HibernateException ("Erro ao iniciar sessao: "
                    + e.getMessage ());
        }
        finally
        {
            return session;
        }
    }
}

como q funciona essas sessões? tipo, se eu chamo getSessaoDoThread ele me retorna a sessao local do thread certo, ai quando eu faço a consulta ele me retorna os dados certinho, mas na consulta eu tava fechando a sessao, ai quando eu ia consultar registros com chave estrangeria dizia q eu estava com a sessao fechada. Ai eu tirei o local q fecha a sessao da consulta e mostra certo novamente. Ai quando eu ia alterar/cadastar eu chamava o getSessao que abre uma nova sessao ai grava no banco, mas quando eu ia consultar q usava a sessao do thread os dados eram os anteriores mesmo fazendo a consulta, se eu fechasse o programa e abrisse novamente ai parecia certo. Dai entao eu deixei pegando sempre a sessao do thread e nao to fechando mais a sessao. Mas, nao creio q isso seja o correto. E olha soh, eu tb tive q adicionar o comando getSessaoDoThread ().clear (); para listar certo. Alguem poderia me explicar melhor como isso funciona?

Muito obrigado a quem me responder.

Criado 7 de junho de 2006
Ultima resposta 8 de jun. de 2006
Respostas 4
Participantes 3