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

Java Hibernate会话在调用query.list()后关闭,java,hibernate,session,transactions,Java,Hibernate,Session,Transactions,在我的服务类中,我有一个名为search()的方法。我创建一个会话,调用createQuery(),获取list(),最后调用session.flush(),但它抛出一个异常,表示会话已关闭 其他详情: 我正在使用Hibernate 4.0.6.RELEASE 我的上下文会话设置为线程 我的代码: session = HibernateUtil.getSessionFactory().openSession(); // Build a StringBuilder that is built

在我的服务类中,我有一个名为
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()
。My
close()
位于finally块中,上面的代码位于try块中

我的问题是:

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)

如果我还没有关闭会话,为什么调用
flush()
时会话会关闭?

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

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

如果你在其他例子中发现了,为什么你不这么做?@romac-我是。我只是在
finally
块中有一个结束符。我在问题中没有看到它。为了澄清我的问题,我在问题中添加了这句话。问题是什么?所以你是说在
list()之后可能有其他东西结束了它?我不打算把
flush()
放在那里,它只是放在那里试试而已。但是当抛出异常时,我觉得很奇怪,不得不问,在你的帖子中,你只说你的会话已关闭,但你不知道是谁做的。对。我只是做了一些进一步的挖掘,有人添加了对另一个方法的调用,该方法也使用了会话,并在其中关闭了会话。所以当它回来的时候,它是关闭的。谢谢你的指导。