Hibernate Сессия закрыта - PullRequest
15 голосов
/ 04 марта 2010

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

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

Ответы [ 7 ]

25 голосов
/ 04 марта 2010

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

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

.Это предложение фактически соответствует найденной вами странице.

Ранее:

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

7 голосов
/ 04 марта 2010

Я думаю, что нашел ответ в:

Сессия закрыта

Я еще не реализовал это

4 голосов
/ 19 марта 2015

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

@Transactional(readOnly = true)
1 голос
/ 29 мая 2013

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

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

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

См. здесь для уточнения

0 голосов
/ 11 декабря 2018

Для обработки сеанса закрыто исключение:

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();
            }
0 голосов
/ 11 августа 2011

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

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

0 голосов
/ 07 июня 2011

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

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

Правильный путь будет:

tx.commit();
session.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...