调用query.list()后Hibernate会话关闭

时间:2015-02-18 15:19:59

标签: java hibernate session transactions

在我的服务类中,我有一个名为search()的方法。我创建一个会话,调用createQuery(),获取list(),最后我调用session.flush(),但它抛出一个异常,说会话已经关闭。

其他细节:
*我正在使用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()位于finally块中,上面是try-block。

我的问题是:如果我还没有关闭它,为什么在调用flush时会话已关闭?

任何帮助或指示都将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:1)

首先,如果您只查询列表,则不应flush会话。其次,会话对象可能由hibernate或其他框架管理,这些框架在执行查询时隐式运行的事务结束时关闭会话。在大多数情况下,您不需要在托管环境中关闭会话,如果您使用BMT,则需要执行此操作。要修复代码,您应该检查会话,如

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