2015-02-18 5 views
1

В моем классе обслуживания у меня есть метод, называемый search(). Я создаю сеанс, вызываю createQuery(), получаю list(), а в конце я звоню session.flush(), но он выдает сообщение об исключении, что сеанс уже закрыт.Спящий сеанс закрыт после вызова query.list()

Другие детали:
* Я использую Hibernate 4.0.6.RELEASE
* Мой контекст сеанса устанавливается на нить

Мой код:

session = HibernateUtil.getSessionFactory().openSession(); 
// Build a StringBuilder that is built according to entered data 

// Create the Query 
Query query = session.createQuery(sql.toString()); 

// After this, do all the needed "query.setString(val1, val2)" stuff 

// Now get the list (which does return values) 
List list = query.list(); 

// Try to call flush on the session 
session.flush(); // <---- This is where the exception is thrown (ServiceImpl.java 2716) 

за исключением простых состояний:

org.hibernate.SessionException: Session is closed! 
at org.hibernate.internal.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:133) 
at org.hibernate.internal.SessionImpl.clear(SessionImpl.java:332) 
at com.company.services.ServiceImpl.search(ServiceImpl.java:2716) 

Я смотрел см., если list() закрывает сеанс, но в других примерах я нашел close() после этого вызова. Мой close() находится в конечном блоке, где приведенное выше находится в блоке try.

Мой вопрос: Почему закрытие сессии при вызове флеша, если я еще не закрыл его?

Любая помощь или направление были бы очень признательны! Благодаря!

+0

Если вы нашли его в других примерах, почему вы этого не сделали? –

+0

@ RomanC - Я. Я просто закрываю блок 'finally'. – Ascalonian

+0

Я не вижу этого в вопросе. –

ответ

1

Прежде всего, вы не должны делать flush сеанс, если вы запрашиваете только список. Во-вторых, объект сеанса может управляться спящим или другими системами, которые закрывают сеанс в конце транзакции, который неявно запускается при выполнении запроса. В большинстве случаев вам не нужно закрывать сеанс в управляемой среде и делать это, если вы используете BMT. Чтобы исправить код, вы должны проверить сеанс, как

if (session.isOpen()) 
    session.close(); 
+0

. Итак, вы говорите, что что-то еще могло закрыть его после 'list()'? Я не планирую держать 'flush()' там, он просто был там, чтобы попробовать что-то. Но когда исключение было брошено, я подумал, что это странно и должно было спросить – Ascalonian

+0

yup, в вашем сообщении вы только сказали, что ваша сессия закрыта, но вы не знаете, кто это сделал. –

+0

Справа. Я просто немного поработал, и кто-то добавил вызов другому методу, который также использовал сеанс и закрыл сеанс там. Поэтому, когда он вернулся, он был закрыт. Спасибо за руководство. – Ascalonian

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