Спящий сеанс закрыт

Когда я вызываю транзакцию метода 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)

Что может быть причиной этой ошибки?

Ответы

Ответ 1

Обновление: Я предполагаю, что вызов getCurrentSession() не гарантирует, что сеанс фактически открыт. В первый раз вы должны использовать

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

вместо этого. Это предложение действительно соответствует найденной вами странице.

Ранее:

Основываясь на информации, доступной до сих пор, мы можем заключить, что причиной ошибки является то, что сеанс не открыт, -)

Ответ 3

Вы можете использовать эту аннотацию в своем методе контроллера:

@Transactional(readOnly = true)

Ответ 4

Вместо полного завершения сеанса вы можете использовать session.disconnect(), выполнить другую работу, затем session.reconnect() перед выполнением других транзакций.

session.close() будет вызываться в самом конце запроса/бизнес-процесса.

В Hibernate 2.1.8 мы использовали один сеанс для каждой модели запроса, и он работает хорошо, избегая утечек сеанса и т.д.

Смотрите здесь для некоторой разработки

Ответ 5

Это может быть причиной

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

Правильный способ:

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

Ответ 6

У меня была та же проблема с закрытой сессией Hibernate год назад. МОЙ ВОПРОС

но это было по другой причине, я ставлю это здесь, если кто-то столкнется с этой проблемой и хочет узнать об этом больше.

Ответ 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();
            }