Mig*_*ing 6 java architecture jsf ejb-3.0 jsf-2
在JSF2应用程序中讨论视图模式中的Open Session是否有意义?我的应用程序有JSF2 Managed Beans调用业务服务EJB来执行所有与db相关的东西(有一个DAO层,但现在无关紧要).
拥有OSIV模式意味着Managed Bean必须以某种方式确保底层会话被打开.
我也在使用JPA.
从理论上讲,问题是完全相同的:实体在离开 EJB 时将成为分离状态,除非某些东西使 EntityManager 的范围保持开放。(这里有一篇关于该主题的精彩文章:JPA 实现模式:延迟加载)。
我从一篇博客文章中读到:
8) 不支持在视图中打开实体管理器。 [...]在EJB3中,当你的实体离开事务范围EntityManager的bean时,它与持久化上下文分离,你可能不再依赖延迟加载(事实上,JPA规范没有指定这种情况下的行为,可能是一些将会抛出依赖于供应商的异常...)当然,您可以使用具有扩展持久性上下文的EntityManager ,只要您愿意,就可以保留事务和持久性上下文。但此功能仅适用于 SFSB,而 DAO 类是无状态服务的典型示例,因为它们仅将调用分派到持久层。此外,为每个客户端提供专用的 DAO bean 实例似乎有点矫枉过正。
但我不确定这是否属实。根据我的理解,您应该能够编写一个 servlet 过滤器,它使用 来UserTransaction启动和提交事务(就像 OSIV 中的常规过滤器)。然后,EJB 将参与过滤器中启动的事务,并且EntityManager将保持打开状态。虽然我还没有测试过,但我的建议是尝试一下。