【问题标题】:Hibernate Session is closed休眠会话已关闭
【发布时间】:2011-01-23 15:05:25
【问题描述】:

当我调用方法 session.begin 事务如下:

//session factory is instantiated via a bean
Session session = this.getSessionFactory().getCurrentSession();
session.beginTransaction();

然后我收到以下异常消息

6:13:52,217 ERROR [STDERR] org.hibernate.SessionException: Session is closed!
at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49)
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1319)

这个错误的原因可能是什么?

【问题讨论】:

  • 你在之前做了什么?请发布代码。
  • 现在,就像一部悬疑电影。
  • 你是如何获得会话的?

标签: hibernate session


【解决方案1】:

更新:我猜调用getCurrentSession() 并不能保证会话实际上是打开的。第一次,你应该使用

Session session = this.getSessionFactory().openSession();
session.beginTransaction();

相反。这个建议其实和你找到的页面是一致的。

之前:

根据目前可用的信息,我们可以得出结论,错误的原因是会话未打开;-)

【解决方案2】:

我想我找到了答案:

Session is Closed

我还没有实现它

【讨论】:

    【解决方案3】:

    可能是这个原因

    session.close();
    tx.commit();
    

    正确的方法是:

    tx.commit();
    session.close();
    

    【讨论】:

    • tx.commit() ,将刷新会话并隐式关闭会话
    【解决方案4】:

    一年前我遇到了同样的休眠会话关闭问题。 MY QUESTION

    但出于不同的原因,我将其放在这里以防有人遇到此问题并想了解更多信息。

    【讨论】:

      【解决方案5】:

      您可以使用session.disconnect(),做一些其他工作,然后session.reconnect(),而不是完全关闭会话。

      session.close() 将在请求/业务流程的最后被调用。

      在 Hibernate 2.1.8 中,我们一直使用每个请求一个会话的模型,它运行良好,避免了会话泄漏等。

      详情请参阅here

      【讨论】:

        【解决方案6】:

        你可以在你的控制器方法上使用这个注解:

        @Transactional(readOnly = true)
        

        【讨论】:

        • 注解类型Transactional的属性readOnly未定义
        • 我指的是import org.springframework.transaction.annotation.Transactional;
        【解决方案7】:

        处理会话关闭异常:

        1-)在您的 hibernate.cfg 文件中,将默认的 hibernate.current_session_context_class 更改为 managed 而不是 thread

        2-)创建两种方法来正确打开和关闭会话,并使用查询之前和之后,如下所示:

         public static void renewSession() {
                try {
                    session = HibernateUtil.getSessionFactory().openSession();
                    session.setFlushMode(FlushMode.MANUAL);
                     ManagedSessionContext.bind(session);
                     session.beginTransaction();
               } catch (Exception e) {
                    e.printStackTrace();
                }
        
            }
            public static void closeSession()
            {
               try {
               ManagedSessionContext.unbind(HibernateUtil.getSessionFactory());
                          session.flush();
                         session.getTransaction().commit();
                    session.close();
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
        

        用法:

        try {
                        renewSession();
                        String query = "from Table tb";
                       data = (List<TypeObject>)session.createQuery(query).list();
                        closeSession();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
        

        【讨论】:

          【解决方案8】:

          以下解决方案对我有用:

          @SuppressWarnings("unchecked")
          public List<Enfermedad> obtenerEnfermedadesOrderByProcal() throws HibernateException {
              if (session==null)
                  session = HibernateUtil.getSession();
              if (!session.isOpen())
                  session = HibernateUtil.getSession();
              return session.createQuery("FROM Enfermedad AS e ORDER BY e.ordenPROCAL, e.id").list();
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-10
            • 2017-08-05
            • 1970-01-01
            • 1970-01-01
            • 2013-07-26
            相关资源
            最近更新 更多