【问题标题】:JSF2: Open Session in View with EJBs?JSF2:使用 EJB 在视图中打开会话?
【发布时间】:2011-03-10 06:23:36
【问题描述】:

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

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

我也在使用 JPA。

【问题讨论】:

    标签: java architecture jsf ejb-3.0 jsf-2


    【解决方案1】:

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

    blog post 我读到:

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

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

    【讨论】:

    猜你喜欢
    • 2011-04-11
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2015-08-14
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    相关资源
    最近更新 更多