Fechar sessão hibernate

3 respostas
prog.tiago

Boa tarde amigos,

Estou com um problema no código a seguir:

public Curso get(Long id){
    Curso c=(Curso)session.get(Curso.class,id);
    session.close();
    return c;
}

Se fecho a sessão antes do retorno, Não consigo retornar pois a sessão já está fechada, se retorno antes de fechar, deixo a sessão aberta.

Como proceder?

:lol:

Abraços

3 Respostas

Guilherme_Gomes

Como assim “não consigo retornar pois a sessão já está fechada”? Se você buscar o objeto e depois fechar a sessão não tem problema!

Você só terá problema com isso se utilizar algum métod LAZY. Por exemplo, chamar uma collection como [B]curso.getAlunos()[/B]. Isso iria gerar uma LazyInitializationException pois a sessão está fechada.

Ajuda o pessoal a entender o seu problema colocando mais informações!

Por exemplo, se for uma aplicação WEB, dá uma olhada no conceito de Open Session in View.

prog.tiago

Obrigado Guilherme,

De fato estou usando um método Lazy como você disse.
Estou desenvolvendo uma aplicação WEB utilizando Flex como Front End e Hibernate para persistência.
Acho que a forma como estou tratanto as Sessions no Hibernate estão meio que erradas. Veja como estão:

CursoDAO

package br.com.contec.acad.modelo.dao;

import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.contec.acad.modelo.beans.Curso;
import br.com.contec.acad.util.persistencia.CriadorSession;

public class CursoDAO {
   
    private Session session;
    Transaction transaction;

    public CursoDAO() {
        session = CriadorSession.getSession();
        transaction = session.beginTransaction();

    }

    public void salva(Curso c) {
        session.save(c);
        transaction.commit();
        session.close();
    }
   
    public Curso get(Long id){
        Curso c=(Curso)session.get(Curso.class, id);
        session.close();
        return c;
    }
   
    public void delete(Curso c){
        session.delete(c);
        transaction.commit();
        session.close();
       
    }

}

MatriculadoDAO

package br.com.contec.acad.modelo.dao;

import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.contec.acad.modelo.beans.Matriculado;
import br.com.contec.acad.util.persistencia.CriadorSession;

public class MatriculadoDAO {
   
    private Session session;
    Transaction transaction;

    public MatriculadoDAO() {
        session = CriadorSession.getSession();
        transaction = session.beginTransaction();

    }

    public void salva(Matriculado m) {
        session.save(m);
        transaction.commit();
        session.close();
    }
   
   
    public Matriculado get(Long id){
        Matriculado m=(Matriculado)session.get(Matriculado.class, id);
        session.close();
        return m;
    }

}

CriadorSession

package br.com.contec.acad.util.persistencia;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class CriadorSession {
   


    public static Session getSession() {
        Configuration config = new Configuration();
        config.configure();
        SessionFactory factory = config.buildSessionFactory();
        Session session = factory.openSession();
        return session;

    }

}

Abraço

Guilherme_Gomes

Realmente tem alguns erros aí!

Primeiro, sua classe criadora de conexões… A SessionFactory deveria ser criada apenas uma vez. E depois você usa ela pra gerar as Sessions.
Com isso, você inicia a SessionFactory quando a aplicação subir (ou lazy) e derruba ela no final (se tiver sido aberta).

Outra coisa é que você está pegando a Session nos construtores dos DAOs e fechando nos métodos, então, o que acontece se eu quiser executar um código como o abaixo?

CursoDAO cdao = new CursoDAO();
Curso curso = cdao.get(1L);
cdao.delete(curso);

Não posso fazer isso! Pois o construtor vai abrir a sessão, o método get() vai fecha-la e inutilizar todo o objeto DAO. Quando chegar no delete(), você teria uma exceção em mãos para tratar.

No próprio site do Hibernate existem vários códigos exemplo, ou aqui mesmo no GUJ pra te ajudar com isso.

Criado 17 de outubro de 2011
Ultima resposta 17 de out. de 2011
Respostas 3
Participantes 2