2010-06-30 58 views
6

在JSF2应用程序中讨论视图模式中的开放会话是否有意义? 我的应用程序有调用业务服务EJB的JSF2托管Bean,这些EJB执行所有与数据库相关的事情(有一个DAO层,但现在没有关系)。JSF2:在EJB中打开会话?

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

我也在使用JPA。

回答

2

理论上,问题是完全一样的:实体在离开EJB时会分离,除非某些东西保持EntityManager的作用域打开。 (这里是一个关于这个话题的伟大的帖子:JPA implementation patterns: Lazy loading)。

blog post我读:

8)没有打开实体管理器在View支持。 [...]在EJB3,当你的实体bean的离开与 交易范围的的EntityManager, 它是从持久化上下文 分离,你可以不再依赖 懒加载(其实,JPA 规范没有指定 行为在这样的情况下,可能 一些依赖于供应商的异常将 抛出......)当然,你可以使用 的EntityManager与扩展 持久化上下文,抱着 事务和持久化上下文 只要哟你想。但是这个功能是 只适用于SFSB,而DAO 类是 无状态服务的典型示例,因为它们只调用 调度到持久层 层。另外,为每个客户端 专门设置了 DAO bean实例似乎是一个大的矫枉过正。

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

+0

Caucho有一个过滤器,例如您所描述的过滤器:http://wiki.caucho.com/TransactionFilter – cdmckay 2010-07-12 19:01:32