在JSF2应用程序中讨论视图模式中的Open Session是否有意义? 我的应用程序有JSF2 Managed Beans调用业务服务EJB来执行所有与db相关的东西(有一个DAO层,但现在没关系)。
拥有OSIV模式意味着Managed Bean必须以某种方式确保底层会话被打开。
我也在使用JPA。
答案 0 :(得分:2)
理论上,问题完全相同:实体在离开EJB时将变为分离,除非某些东西使EntityManager的范围保持打开状态。 (这是关于该主题的一篇很棒的帖子:JPA implementation patterns: Lazy loading)。
从blog post我读到:
8)在View支持中没有Open Entity Manager。 [...]在EJB3中,当您的实体离开bean时 使用事务范围 EntityManager, 它脱离了持久性 上下文,你可能不再依赖 延迟加载(事实上,JPA 规范没有指定 在这种情况下的行为,可能 一些供应商依赖的例外 被抛出......)当然,你可以使用 具有扩展名的EntityManager 持久化上下文,持有 事务和持久化上下文 只要你愿意。但是这个功能是 仅适用于SFSB,而DAO 类是典型的例子 无国籍服务,因为他们只 调度持久性调用 层。另外,有专门的 每个客户端的DAO bean实例 似乎是一个很大的矫枉过正。
但我不确定这是真的。根据我的理解,你应该能够编写一个servlet过滤器,它使用UserTransaction
来启动和提交事务(就像OSIV中的常规过滤器一样)。然后EJB将参与在过滤器中启动的事务,EntityManager
将保持打开状态。我没有测试过,但我的建议是尝试一下。