调用 query.list() 后休眠会话关闭
Hibernate session closed after calling query.list()
在我的服务 class 中,我有一个名为 search()
的方法。我创建了一个会话,调用 createQuery()
,获取 list()
,最后我调用了 session.flush()
,但它抛出了一个异常,表明会话已经关闭。
其他详情:
- 我正在使用 Hibernate 4.0。6.RELEASE
- 我的上下文会话设置为 thread
我的代码:
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 块中。
我的问题是:
如果我还没有关闭它,为什么在调用 flush()
时会话会关闭?
首先,如果您只查询列表,则不应 flush
会话。其次,会话对象可能由休眠或其他框架管理,这些框架会在您进行查询时隐式运行的事务结束时关闭会话。在大多数情况下,您不需要关闭托管环境中的会话,如果您使用的是 BMT,则需要这样做。要修复代码,您应该检查会话
if (session.isOpen())
session.close();
在我的服务 class 中,我有一个名为 search()
的方法。我创建了一个会话,调用 createQuery()
,获取 list()
,最后我调用了 session.flush()
,但它抛出了一个异常,表明会话已经关闭。
其他详情:
- 我正在使用 Hibernate 4.0。6.RELEASE
- 我的上下文会话设置为 thread
我的代码:
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 块中。
我的问题是:
如果我还没有关闭它,为什么在调用 flush()
时会话会关闭?
首先,如果您只查询列表,则不应 flush
会话。其次,会话对象可能由休眠或其他框架管理,这些框架会在您进行查询时隐式运行的事务结束时关闭会话。在大多数情况下,您不需要关闭托管环境中的会话,如果您使用的是 BMT,则需要这样做。要修复代码,您应该检查会话
if (session.isOpen())
session.close();