在Java EE环境中何时打开/关闭hibernate会话



在http请求开始时打开并在结束时关闭,每个http请求在单独的线程中处理?

也许保存所有会话在HashMap和静态访问它?

任何解释hibernate会话是如何工作的(或者它们到底是什么)的信息都是有帮助的。

如果在请求的开始/结束意味着http请求,那么这通常是由servlet过滤器来完成的,它为您打开/关闭会话。这种设计模式被称为OpenSessionInView (Filter)。

此模式仅在应用程序在Hibernate会话存在的同一JVM中呈现时才有用。如果您的数据访问层驻留在与视图呈现层不同的JVM上,那么在调度视图呈现请求之前,您将不得不(急切地)获取所有所需的模型bean。

如果你正在使用spring(或EJB3),你可以在你的Data Access类中注入Session (EntityManager),这样你就不需要手动打开和关闭Session了。

理想情况下,您不应该需要手动打开/关闭会话/事务(因为它可能会错过会话.close()或txt .commit()等)。相反,使用容器提供的JPA entitymanager或使用spring为您管理它。

有多种使用会话的模式,但最常见且通常最合适的模式是在每个请求(=thread=unit of work)时打开和关闭会话

在JavaEE环境中,您通常使用JPA。因此,通过EntityManager使用hibernate,可以使用@PersistenceContext

将其注入组件(如ejb或cdi托管bean)。

通常当需要访问数据存储(例如事务开始)时,会话是打开的。何时关闭它有不同的模式和方法。您可以在视图(jsp)中保持会话打开。但你不必这么做。

。我们的一个项目不允许使用opensessionInView过滤器。因此,在事务结束后,会话被关闭。所有需要发送到视图的数据(基本上是值对象)都在调度前加载。

最新更新