2011-09-20 83 views

回答

2

如果在请求/请求结束时意味着http请求,那么通常通过一个servlet过滤器来完成,该servlet过滤器会为您打开/关闭会话。这种设计模式称为OpenSessionInView(Filter)。你可以得到详细信息here

仅当应用程序呈现在存在Hibernate Session的相同JVM中时,此模式才有用。如果您的数据访问层位于与视图渲染层不同的JVM上,则您必须(急切地)获取所有必需的模型bean,然后分派呈现视图的请求。

如果您使用的是spring(或EJB3),您可以将Session(EntityManager)注入到您的数据访问类中,因此您无需手动处理打开和关闭会话。

理想情况下,您不应该需要手动打开/关闭会话/事务(因为它会遗漏session.close()或tx.commit()等)的机会。而是使用容器提供的JPA entitymanager或者使用spring来为你管理它。

+0

同意。另外,如果你使用Spring MVC,它提供了一个'OpenSessionInViewFilter'和一个'OpenSessionInViewInterceptor'。 – SingleShot

1

有使用会话的多种模式,但最常见的,通常正确的一个是打开和关闭它在每个请求(=线程=工作单位)

在JavaEE的环境中,你通常会利用JPA。所以休眠通过EntityManager,可以在部件被注射(如EJB或CDI管理豆)与@PersistenceContext

0

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

例如我们的一个项目不允许使用opensessionInView过滤器。所以会议在交易结束后关闭。所有数据(Value对象基本上)需要发送的视图都在调度之前加载。