Lazy collections + Thread Local Session

2 respostas
C

Olá pessoal!!!

Estou me batendo um pouco com o hibernate e lazy collections...

Estou usando o padrão "Thread Local Session" e minhas collections
são "lazy=true". Abaixo um metodo do meu objeto DAO que recupera um
objeto do banco.

protected Object retrieveObj(Class c, Long id) 
        throws  DAOException {
        Object obj = null;

        try {
            Session session = HibernateSession.currentSession();
            obj = session.load(c, id);
        }
        catch(HibernateException he) {
            he.printStackTrace();
            throw new DAOException(he);
        }
        finally {
            closeSession();
        }
        return obj;
    }

Ele retorna o objeto com as collections não inicializadas... e qdo
tento acessá-las dá erro...
O problema é que eu não posso dar o closeSession() qdo utilizo
lazy=true? É isso mesmo?
Qual seria a solução para isso? tirar o closeSession?

Ou... estou viajando e não é nada disso... :?:

Alguem tem alguma sugestão?

Agradeço a atenção dispensada,

Teh mais!

2 Respostas

A

A estratégia que eu usei para resolver este problema foi passando um booleano como parâmetro. Esse booleano informa se é para inicializar as coleções.
Depois um criei um classe utilitária que percorre o objeto recursivamente(usando reflection). Toda coleção que ele acha ele pede pro hibernate inicializar.
Com o código que vc passou ficaria desse jeito:

protected Object retrieveObj(Class c, Long id, boolean inicializarColecoes) 
        throws  DAOException { 
        Object obj = null; 

        try { 
            Session session = HibernateSession.currentSession(); 
            obj = session.load(c, id);
            
            // Chamada do método que inicializa as coleções
            if( inicializarColecoes ) {
                Util.inicializarColecoes( obj );
            }
 
        } 
        catch(HibernateException he) { 
            he.printStackTrace(); 
            throw new DAOException(he); 
        } 
        finally { 
            closeSession(); 
        } 
        return obj; 
    }

Acho que é isso.
Abraços.

R

Oi,
Também estou para implementar a mesma solução via relfexão para inicializar as coleções.
Seria uma mão na roda para mim se vc passasse o código…
Ademias, vou permitir q o cliente indique quais coleções ele quer inicializar…coisa q não percebi no seu trecho de código…

Tô esperando…depois pago uma ceva…

Valeu :slight_smile:

Criado 27 de abril de 2004
Ultima resposta 19 de mai. de 2004
Respostas 2
Participantes 3