JSF2:使用EJB在视图中打开会话?

时间:2010-06-30 17:21:37

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

在JSF2应用程序中讨论视图模式中的Open Session是否有意义? 我的应用程序有JSF2 Managed Beans调用业务服务EJB来执行所有与db相关的东西(有一个DAO层,但现在没关系)。

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

我也在使用JPA。

1 个答案:

答案 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将保持打开状态。我没有测试过,但我的建议是尝试一下。