2014-01-09 3 views
2

Я получаю эту errprHibernate Session закрыт при использовании транзакционной аннотации класса DAO

org.springframework.orm.hibernate3.HibernateSystemException: Session is closed!; nested exception is org.hibernate.SessionException: Session is closed! 
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:690) 
    at org.springframework.orm.hibernate3.SpringSessionSynchronization.translateException(SpringSessionSynchronization.java:160) 
    at org.springframework.orm.hibernate3.SpringSessionSynchronization.beforeCommit(SpringSessionSynchronization.java:148) 
    at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCommit(TransactionSynchronizationUtils.java:95) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(AbstractPlatformTransactionManager.java:924) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:737) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622). 
..... 

    Caused by: org.hibernate.SessionException: Session is closed! 
    at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:993) 
.............` 

Моего DAO Класс

@Transactional 
@Repository(value = "flightBookingDao") 
public class FltBookingDao { 

    @Resource 
    private GenericDaoService genericDaoService; 

    public Flightbooking getFlightBookingObjByMmtid(final String mmtId) { 

    final String SQL_QUERY = "from Flightbooking where fbkMmtid = '" + mmtId + "'"; 
    final List<Flightbooking> list = genericDaoService.executeNativeQuery(SQL_QUERY); 
    if ((list == null) || (list.size() == 0)) { 
     logger.debug("XXXX -- Getting null/empty flightBooking Object from DB -- XXXX"); 
     return null; 
    } else { 
     return list.get(0); 
    } 
} 

@Service(value = "genericDaoService") 
public class GenericDaoService extends HibernateDaoSupport { 

public List<Object> executeNativeQuery(final String queryString) { 

    List<Object> list = null; 
    final Session session = this.getSession(); 
    try { 
     final Query query = session.createQuery(queryString); 
     list = query.list(); 
    } catch (final Exception e) { 
     LOGGER.error("XXX Error in executing query " + queryString + " XXX " + e); 
    } finally { 
     session.flush(); 
     session.close(); 
    } 
    return list; 
} 

}

Конфигурации (я просто добавить соответствующую конфигурацию что я считаю необходимым)

<property name="mappingResources"> 
     <list> 
      <value>com/yyy/bus/pojo/Flightbooking.hbm.xml</value> 
     </list> 
    </property> 

<property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.current_session_context_class"> 
       ${hibernate.current_session_context_class} // value is set to thread 
      </prop> 
     </props> 
    </property> 

    <context:component-scan base-package="com.yyy.bus.dao"> 

ответ

4

В соответствии с вашим кодом, вы используете TransactionManager Spring для управления транкацией, то есть вам не нужно закрывать сеанс вручную, TransactionManager освободит ресурс после его использования.
Одним словом, здесь есть два решения:
1,

session = this.getSession(); // retrive session from current thread 
// do sth 
// needn't close session manually 

2,

session = this.getHibernateTemplate() 
       .getSessionFactory().openSession(); // here open a new session 
// do sth 
session.close(); 
+0

Можете ли вы выделить причину сделать это. И в чем проблема? –

+0

Теперь должно быть ясно, надеюсь, что вы сможете помочь :) –

+0

Теперь он кристально чист. Спасибо за вашу помощь. :) –

Смежные вопросы