休眠会话在 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)
.............`

我的道课

@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">

根据上面的代码,您正在使用 Spring 的 TransactionManager 来控制转换,也就是说您不需要手动关闭会话,TransactionManager 会在您使用后释放资源。
总之,这里有两个解决方案:
1、

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

阿拉伯数字

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

最新更新