【问题标题】:Hibernate Session is closed while using Transactional annotation on DAO class在 DAO 类上使用事务注释时关闭休眠会话
【发布时间】:2014-01-09 16:04:58
【问题描述】:

我收到了这个错误

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

【问题讨论】:

    标签: java spring hibernate session


    【解决方案1】:

    根据你上面的代码,你使用Spring的TransactionManager来控制事务,也就是说你不需要手动关闭会话,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();
    

    【讨论】:

    • 能否请您强调这样做的原因。其背后的问题是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    相关资源
    最近更新 更多