6

在 JSF2 应用程序中讨论 Open Session In View 模式有意义吗?我的应用程序具有调用业务服务 EJB 的 JSF2 托管 Bean,这些 EJB 执行所有与数据库相关的工作(有一个 DAO 层,但现在没关系)。

拥有 OSIV 模式意味着托管 Bean 必须以某种方式确保底层会话已打开。

我也在使用 JPA。

4

1 回答 1

2

从理论上讲,问题是完全相同的:实体在离开 EJB 时将变得分离,除非某些东西保持 EntityManager 的范围打开。(这里有一篇关于这个主题的好文章:JPA implementation patterns: Lazy loading)。

从一篇博文中我读到:

8) 没有 Open Entity Manager In View 支持。 [...] 在 EJB3 中,当您的实体使用事务范围的 EntityManager 离开 bean 时,它与持久性上下文分离,您可能不再依赖延迟加载(事实上,JPA 规范没有指定这种情况下的行为,可能是一些将抛出与供应商相关的异常...)当然,您可以使用带有扩展持久性上下文的 EntityManager,只要您愿意,就可以保持事务和持久性上下文。但是这个特性只适用于 SFSB,而 DAO 类是无状态服务的典型例子,因为它们只向持久层分发调用。此外,为每个客户端拥有专用的 DAO bean 实例似乎是一个很大的矫枉过正。

然而,我不确定这是真的。根据我的理解,您应该能够编写一个 servlet 过滤器,它使用UserTransaction来启动和提交事务(如 OSIV 中的常规过滤器)。然后,EJB 将参与在过滤器中启动的事务并EntityManager保持打开状态。虽然我还没有测试过,但我的建议是试一试。

于 2010-06-30T18:33:15.333 回答