Session is closed - Hibernate

4 respostas
luiz_ross

Estou com um pequeno problema: fiz uma pagina de pesquisa usando hibernate, a pesquisa quando feita uma primeira vez funciona blz, se eu dou um voltar no browser e tento pesquisar de novo estoura a exception na tela dizendo “Session is closed”. No código eu conferi e estou abrindo e fechando a sessão corretamente. Alguma ideía do que possa estar causando isso?

4 Respostas

_fs

Cara, isso já aconteceu comigo e eram duas as razões em momentos diferentes:

  • tentar inicializar uma lazy collection na view, sendo que a session já estava fechada a tempos
  • estava tentando pegar a connection a partir da session, e tentava fechar a primeira antes de fechar a segunda. Bizarro que o erro também só ocorria na segunda request. Se o caso é esse, feche primeiro a connection e depois a session.
luiz_ross

O mais estranho é que eu não pego a connection a partir da session

Esse é o código que retorna a pesquisa
public List getCategoriesList() {
		Session session = null;

		try {
			session = HibernateSessionFactory.currentSession();

			Query query = session.createQuery("select Categories from br.com.dts.dtswebnorthwind.beans.Categories Categories order by Categories.categoryname");
			return query.list();

		} catch (HibernateException e) {
			System.err.println("Hibernate Exception" + e.getMessage());
			throw new RuntimeException(e);
		} finally {
			if (session != null) {
				try {
					session.close();
				} catch (HibernateException e) {
					System.err.println("Hibernate Exception" + e.getMessage());
					throw new RuntimeException(e);
				}
			}
		}
	}

E esse é o código que abre e fecha a session

public static Session currentSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

        if (session == null) {
            if (sessionFactory == null) {
                try {
                    cfg.configure(CONFIG_FILE_LOCATION);
                    sessionFactory = cfg.buildSessionFactory();
                }
                catch (Exception e) {
                    System.err.println("%%%% Error Creating SessionFactory %%%%");
                    e.printStackTrace();
                }
            }
            session = sessionFactory.openSession();
            threadLocal.set(session);
        }

        return session;
    }

    public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);

        if (session != null) {
        	session.flush();
            session.close();
        }
    }
luiz_ross
achei o gato Lipe.No trecho
public List getCategoriesList() {
		Session session = null;

		try {
			session = HibernateSessionFactory.currentSession();

			Query query = session.createQuery("select Categories from br.com.dts.dtswebnorthwind.beans.Categories Categories order by Categories.categoryname");
			return query.list();

		} catch (HibernateException e) {
			System.err.println("Hibernate Exception" + e.getMessage());
			throw new RuntimeException(e);
		} finally {
			if (session != null) {
				try {
					session.close(); [b]//Bem aki eu estou fechando com session.close() mas o correto seria HibernateSessionFactory.closeSession();	[/b]			} catch (HibernateException e) {
					System.err.println("Hibernate Exception" + e.getMessage());
					throw new RuntimeException(e);
				}
			}
		}
	}
[/code]
_fs

Que bom ;D

Mas, porquê não consegue pegar a connection??

Criado 7 de outubro de 2004
Ultima resposta 7 de out. de 2004
Respostas 4
Participantes 2