Erro estranho na Sessão do Hibernate, na segunda requisição
2 respostas
D
diegogmarques
Pessoal
Tenho uma aplicação que usa Hibernate e JPA.
Quando eu inicializo a aplicação, tudo funciona corretamente. Porém, se após carregar a tela, eu tenho recarregar (simplesmente atualizar a página, apertando F5), dá o seguinte erro:
Se após este erro, eu atualizo novamente a página, tudo funciona denovo, mas se eu atualizar novamente, após funcionar, novamente ocorre este erro.
Estranhamente, após carregar a aplicação pela primeira vez, a cada vez que recarrego a página, ocorre o inverso do que havia ocorrido na vez anterior (quando tudo funciona, na próxima vez dará erro… quando dá erro, na próxima vez funciona). Deu pra entender o problema?
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factoryname="hibernate/sessionFactory"><propertyname="connection.datasource">jdbc/scpdDS</property><propertyname="dialect">org.hibernate.dialect.MySQLDialect</property><propertyname="query.substitutions">true1,false0,yes'Y',no'N'</property><propertyname="connection.isolation">2</property><propertyname="show_sql">true</property><propertyname="format_sql">true</property><propertyname="use_sql_comments">true</property><propertyname="jdbc.batch_size">0</property><propertyname="jdbc.batch_versioned_data">true</property><propertyname="max_fetch_depth">3</property><propertyname="jdbc.fetch_size">25</property><propertyname="default_batch_fetch_size">8</property><propertyname="default_entity_mode">pojo</property><propertyname="order_updates">true</property><propertyname="generate_statistics">false</property><propertyname="jdbc.use_streams_for_binary">true</property><propertyname="connection.release_mode">auto</property><propertyname="transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property><propertyname="transaction.manager_lookup_class">org.hibernate.transaction.SunONETransactionManagerLookup</property><propertyname="transaction.auto_close_session">true</property><propertyname="transaction.flush_before_completion">true</property><propertyname="current_session_context_class">jta</property><propertyname="connection.aggressive_release">true</property><propertyname="cache.use_query_cache">false</property><propertyname="cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property><mappingclass="entities.Perfil"/><mappingclass="entities.Usuario"/><mappingclass="entities.Disciplina"/></session-factory></hibernate-configuration>
HibernateUtil.java
packageutil;importorg.hibernate.Session;importorg.hibernate.SessionFactory;importorg.hibernate.cfg.AnnotationConfiguration;importorg.hibernate.cfg.Configuration;publicclassHibernateUtil{privatestaticSessionFactorysessionFactory;@SuppressWarnings("unchecked")publicstaticfinalThreadLocalsession=newThreadLocal();static{try{Configurationconfig=newAnnotationConfiguration();sessionFactory=config.configure().buildSessionFactory();}catch(Exceptione){e.printStackTrace();}}@SuppressWarnings("unchecked")publicstaticSessioncurrentSession(){Sessions=(Session)session.get();// Open a new Session, if this Thread has none yetif(s==null){s=sessionFactory.openSession();session.set(s);}returns;}@SuppressWarnings("unchecked")publicstaticvoidcloseSession(){Sessions=(Session)session.get();if(s!=null){s.close();}session.set(null);}publicstaticSessiongetCurrentSession(){returnsessionFactory.getCurrentSession();}publicstaticSessionFactorygetSessionFactory(){returnsessionFactory;}}
GenericHibernateDAO.java
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packagedao.hibernate;importutil.*;importdao.GenericDAO;importjava.io.Serializable;importjava.lang.reflect.ParameterizedType;importjava.util.List;importorg.hibernate.Criteria;importorg.hibernate.Session;importorg.hibernate.criterion.Criterion;importorg.hibernate.criterion.Example;publicabstractclassGenericHibernateDAO<T,IDextendsSerializable>implementsGenericDAO<T,ID>{privateClass<T>persistentClass;privateSessionsession;@SuppressWarnings("unchecked")publicGenericHibernateDAO(){this.persistentClass=(Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];}publicvoidsetSession(Sessions){this.session=s;}protectedSessiongetSession(){if(session==null)session=HibernateUtil.getCurrentSession();returnsession;}publicClass<T>getPersistentClass(){returnpersistentClass;}@SuppressWarnings("unchecked")publicTfindById(IDid){Tentity=(T)getSession().get(getPersistentClass(),id);returnentity;}publicList<T>findAll(){returnfindByCriteria();}@SuppressWarnings("unchecked")publicList<T>findByExample(TexampleInstance){Criteriacrit=getSession().createCriteria(getPersistentClass());Exampleexample=Example.create(exampleInstance);crit.add(example);returncrit.list();}publicTsave(Tentity){getSession().saveOrUpdate(entity);returnentity;}publicTsaveOrUpdate(Tentity){getSession().saveOrUpdate(entity);returnentity;}publicTupdate(Tentity){getSession().update(entity);returnentity;}publicvoiddelete(Tentity){getSession().delete(entity);}publicvoiddeleteById(IDid){Tentity=this.findById(id);this.delete(entity);}publicvoidflush(){getSession().flush();}publicvoidclear(){getSession().clear();}@SuppressWarnings("unchecked")protectedList<T>findByCriteria(Criterion...criterion){Criteriacrit=getSession().createCriteria(getPersistentClass());for(Criterionc:criterion){crit.add(c);}returncrit.list();}}
Ou seja, sua Session está fechada.
Em alguma parte do seu código você está tentando utilizar a Session que está fechada.
A forma mais simples de achar esse problema é debugar o código, inserir break-point, e investigar passo a passo. Aconselho iniciar pelo método que carrega a página.
G
garcia-jj
Uma observação: ou você usa JPA ou hibernate.xml.
Noto que você está usando hibernate.cfg.xml, além de uma HibernateUtils. Ou seja, você assim usa o hibernate crú. Porém você possui um persistence.xml. Sendo assim você tem uma session de JPA e uma manual do Hibernate.