Duvida com Fechamento da sessão no Hibernate em des.web

ola pessoal me ajudem se puder.
tenho um hibernate util

public class HibernateUtilidades {

    //inicializa uma sessão como estátic que tem as configurações do Hibernate
    private static SessionFactory sessionFactory;
    //threads usadas para estancias apenas sessões
    private static final ThreadLocal<Session> sessionThread;
    //thread usadas somente para estanciar transações
    private static final ThreadLocal transactionThread;


    static {
        try {
            sessionThread = new ThreadLocal();
            
            transactionThread = new ThreadLocal();
            AnnotationConfiguration configuration = new AnnotationConfiguration();
            configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
            configuration.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
            configuration.setProperty("hibernate.connection.url", "jdbc:mysql://IP:3306/BANCO");
            configuration.setProperty("hibernate.connection.username", "username");
            configuration.setProperty("hibernate.connection.password", "password");
            configuration.setProperty("hibernate.order_updates", "true");
            configuration.setProperty("hibernate.show_sql", "true");
            configuration.setProperty("hibernate.format_sql", "true");
            configuration.setProperty("hibernate.hbm2ddl.auto", "update");
            for (Class clazz : getClasses("br.com.cristaltemper.eleicaocipa.pojo")) {
                configuration.addAnnotatedClass(clazz);
            }
            sessionFactory = configuration.buildSessionFactory();
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    //metodo privado para varrer o diretorio das classes(addAnotationClass) e
    //adicionar no contexto do hibernate
    private static List<Class> getClasses(String pckgname) throws ClassNotFoundException {
        List<Class> classes = new ArrayList<Class>();
        ClassLoader cld = Thread.currentThread().getContextClassLoader();
        
        String path = pckgname.replace('.', '/');
        URL resource = cld.getResource(path);
        File directory = new File(resource.getFile());
        if (directory.exists()) {
            String[] files = directory.list();
            for (int i = 0; i < files.length; i++) {
                if (files[i].endsWith(".class")) {
                    classes.add(Class.forName(pckgname + '.' + files[i].substring(0, files[i].length() - 6)));
                }
            }
        }
        return classes;
    }

    
    public static Session getSession() {
        Session session = sessionFactory.openSession();
        sessionThread.set(session);       
        return session;
    }

    
    public static void closeSession() {
        Session session = (Session) sessionThread.get();
        if (session != null && session.isOpen()) {
            session.flush();
            session.close();
        }
        sessionThread.set(null);
    }

    
    public static void beginTransaction() {
        Transaction transaction = sessionThread.get().beginTransaction();
        transactionThread.set(transaction);
    }

    
    public static void commitTransaction() {
        Transaction transaction = (Transaction) transactionThread.get();
        if (transaction != null && !transaction.wasCommitted() && !transaction.wasRolledBack()) {
            transaction.commit();
            transactionThread.set(null);
        }

    }

    
    public static void rollbackTransaction() {
        Transaction transaction = (Transaction) transactionThread.get();
        if (transaction != null && !transaction.wasCommitted() && !transaction.wasRolledBack()) {
            transaction.rollback();
            transactionThread.set(null);
        }
    }
}

tenho um DAO generico

public abstract class GenericDAO {

    protected static Session session = null;

    public GenericDAO() {        
    }

public List list(Class clazz) {     
        session = HibernateUtil.getSession();
        List lista = session.createCriteria(clazz).list();        
        HibernateUtil.closeSession();
        return lista;

    }

tenho uma classe que tem relacionamentos com outras e as outras tem relacionamento com mais outras e etc…
o problema é que quando tento listar uma classe que tem relacionamentos da varios problemas pois a sessão esta fechada. Quando comento o closesession do metodo list ai funciona! quando fechar a sessão realmente então?

da o seguinte erros nos list de cada classe

[
Conversion Error. See console log.,
Conversion Error. See console log.,
Conversion Error. See console log.,
Conversion Error. See console log.,
]

em outra

No row with the given identifier exists: [pacote.classe#1]

o que pode ser?

onde vcs fecham suas sessões em suas aplicações web?

tentei colocar ate no facade mas não deu pois mesmo retornando ele ainda não preencheu todas as listas necessarias dos beans então ele fecha e interrompe o carregamento

veja o codigo no facade:

@RemoteMethod
public Eleitor getById(String chapa) {
try {
return (Eleitor) dao.getById(Eleitor.class, (Serializable) chapa);
} finally {
HibernateUtil.closeSession();
}
}

se eu trabalhar com a sessão aberta ai funciona

Na página do Hibernate, eles explicam como fazer utilizando filtros.

Acho que o endereço é esse http://www.hibernate.org/43.html.

Não to conseguindo acessar no momento mas dá uma olhadinha.

eu achei sobre Open Session in View que é um padrao para fechamento de sessão na web. isso ta me ajudando

http://blog.caelum.com.br/2008/01/28/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/

este também

http://www.hibernate.org/43.html

só que estou com dificuldade em implementa o filtro em minha aplicação alguem pode me ajudar ou me passar um link?

public List list(Class clazz) {
session = HibernateUtil.getSession();
List lista = session.createCriteria(clazz).list();
HibernateUtil.closeSession();
return lista;

}  

public abstract class GenericDAO {

veja se o problema não está no seu dao genérico:

public GenericDAO() {
}

public List list(Class clazz) {
session = HibernateUtil.getSession();
List lista =(clazz) session.createCriteria(clazz).list();//este método retorna um list de clazz
HibernateUtil.closeSession();
return lista;

}

ele pode não está convertenado o list retornado no criteria em um list de object. se der certo posta a resposta!!! espero ter ajudado!!!

veja também se quando você trabalha com a sessão aberta o postgres não fica abrindo varias instâncias “postgres.exe” no gerenciador de dispositivos, caso utiliza windows!!!

Eu resolvi utilizando filter mesmo no site do Hibernate tem a classe la é só pegar e colocar no projeto e fazer algumas adaptações para que realmente funcione ,pelo menos aqui no meu projeto tive que fazer. E configurar o xml da aplicação adicionando um novo filtro. Ok vlw pessoal pela força :wink: