Java hibernate会话是否在春季结束?

Java hibernate会话是否在春季结束?,java,spring-boot,hibernate-5.x,Java,Spring Boot,Hibernate 5.x,我用spring boot和hibernate开发了一个简单的应用程序。我过去常常通过sessionfactory.opensession()获取会话完成所有操作后是否需要手动关闭会话 在多请求web应用程序中使用opensession()而不是getcurrentsession()是否是一个好主意?当您完成后,它应该关闭(但我们将看到,这可以自动为您完成)。 这完全取决于您如何获得会话 如果使用sessionFactory.getCurrentSession(),将获得一个“当前会话”,该会话

我用spring boot和hibernate开发了一个简单的应用程序。我过去常常通过
sessionfactory.opensession()获取会话完成所有操作后是否需要手动关闭会话


在多请求web应用程序中使用
opensession()
而不是
getcurrentsession()
是否是一个好主意?

当您完成后,它应该关闭(但我们将看到,这可以自动为您完成)。 这完全取决于您如何获得会话

如果使用sessionFactory.getCurrentSession(),将获得一个“当前会话”,该会话绑定到事务的生命周期,并在事务结束时自动刷新和关闭(提交或回滚)

如果决定使用sessionFactory.openSession(),则必须自己管理会话,并“手动”刷新和关闭会话

有关更多信息,请查看

那么,为您编辑:

openSession()总是打开一个新的会话,在完成操作后必须关闭该会话。getCurrentSession()返回绑定到上下文的会话-您不需要关闭此会话

Edit2

将hibernate.current\u session\u context\u类设置为线程,然后实现类似于打开会话的servlet筛选器的功能-然后您可以使用SessionFactory.getCurrentSession()在其他任何地方访问该会话

openSession()总是打开一个新的会话,在完成操作后必须关闭该会话。getCurrentSession()返回绑定到上下文的会话-您不需要关闭此会话

如果您使用Spring或EJB来管理事务,您可以将它们配置为在事务中打开/关闭会话


您不应该为每个web应用使用一个会话-会话不是线程安全对象-不能由多个线程共享。您应该始终使用“每个请求一个会话”或“每个事务一个会话”

@asanka12此答案是否满足您的查询?谢谢@Adya的回答。这对我很有帮助。顺便说一句,由于spring容器,我处于素食环境中。我需要澄清,如果我从spring获得会话,spring是否会为我关闭会话opensession@asanka12我在ans中添加了更多内容,请检查并接受答案,如果它满足您的查询。请检查正确的勾号以接受答案?如果hibernate在多线程环境(如web应用程序)中使用,我需要使用opensession或getcurrentsession吗?可能的副本不应该这样做。使用
EntityManager
而不是
Session
Session
现在甚至扩展了
EntityManager
),将其注入
@PersistenceContext
,并使用
@Transactional
为您处理一切。更好的是,您可以使用Spring数据JPA为您自动生成大多数DAO。@chrylis早些时候我使用了Spring JAP,现在我需要通过Hibernate来完成。“需要”为什么,确切地说?@chrylis让我们说一下。