gpt4 book ai didi

java - 调用 query.list() 后 Hibernate session 关闭

转载 作者:太空宇宙 更新时间:2023-11-04 06:12:01 25 4
gpt4 key购买 nike

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

其他详细信息:

  • 我正在使用 Hibernate 4.0.6.RELEASE
  • 我的上下文 session 设置为线程

我的代码:

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)

异常(exception):

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() 是否关闭 session ,但我发现其他示例在该调用之后执行了 close() 。我的 close() 位于 finally block 中,而上面的内容位于 try block 中。

我的问题是:

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

最佳答案

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

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

关于java - 调用 query.list() 后 Hibernate session 关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28587089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com