2010-03-04 2 views
15

Когда я называю session.begin сделки метод следующим образом:Hibernate Session закрыт

//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) 

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

+2

Что вы делаете _before_ это исключение? Отправьте код, пожалуйста. –

+2

Прямо сейчас, Это похоже на загадочный фильм. – Padmarag

+0

Как вы получили сеанс? –

ответ

25

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

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

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

Ранее:

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

+0

+1 Согласен полностью. – Padmarag

+0

См. Также http://stackoverflow.com/questions/8046662/hibernate-opensession-vs-getcurrentsession – rogerdpack

7

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

Session is Closed

Я еще реализовать его

+0

Рад, что вы решили тайну. – Padmarag

0

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

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

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

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

Я была такая же Hibernate Session Closed Problem год назад. MY QUESTION

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

1

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

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

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

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

2

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

@Transactional(readOnly = true) 
+0

Атрибут readOnly не определен для типа аннотации Transactional –

+0

Я ссылался на этот 'import org.springframework.transaction.annotation.Transactional;' – ACV

Смежные вопросы