Спящий сеанс закрыт
Когда я вызываю транзакцию метода 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();
вместо этого. Это предложение действительно соответствует найденной вами странице.
Ранее:
Основываясь на информации, доступной до сих пор, мы можем заключить, что причиной ошибки является то, что сеанс не открыт, -)
Ответ 2
Я думаю, что нашел ответ в:
Сессия закрыта
Я еще не реализовал его
Ответ 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();
}