【问题标题】:Injecting an entity manager in a SFSB with Seam使用 Seam 在 SFSB 中注入实体管理器
【发布时间】:2011-03-02 19:06:47
【问题描述】:

我正在使用 Seam 构建一个 Web 应用程序,使用有状态会话 EJB 作为业务组件(也注释为 Seam 组件)。在这种情况下,使用@In 或@PersistenceContext 注入实体管理器的最佳实践是什么?这两个选项之一会给我带来问题吗? (假设对话的持续时间及其相关的持久性上下文不是问题)

如果我选择使用@In 并且需要将方法标记为非事务性,我应该使用@Transactional(TransactionPropagationType.SUPPORTS) 还是@TransactionAttribute(TransactionAttributeType.SUPPORTS)?

【问题讨论】:

    标签: transactions dependency-injection entity seam ejb


    【解决方案1】:

    使用 Seam 管理的持久性上下文而不是标准的容器管理的持久性上下文不会有任何问题,所以在我看来,最好的做法是使用 @In。 使用 Seam 管理的持久性上下文的优点包括:

    • 您可以在非 EJB Seam 组件中注入相同的持久性上下文
    • 在视图中使用<s:convertEntity>(假设您要使用JSF)
    • 在查询语言中使用 EL
    • 您已将持久性上下文绑定到对话上下文(如果理解正确,对您来说并不重要)

    如果您选择@In,即Seam 管理的持久性上下文,那么您可以在非EJB Seam 组件中使用@Transactional 进行声明性事务划分,而@TransactionAttribute 没有意义。 对于注解为 Seam 组件 (@Name) 的 EJB 会话 bean,@TransactionAttribute 应与为 EJB3 定义的语义相同。

    由于@Transactional 没有REQUIRES_NEW 值,因此如参考文档中所述,以下适用:

    如果您使用 EJB3 并标记您的类或方法@TransactionAttribute(REQUIRES_NEW) 那么事务和持久性上下文不应该被传播到这个的方法调用 目的。然而,由于 Seam 管理的持久性上下文被传播到任何组件 在对话中,它将传播到标记为REQUIRES_NEW 的方法。所以, 如果您标记方法REQUIRES_NEW,那么您应该使用访问实体管理器 @PersistenceContext.

    丹·艾伦 (Dan Allen) 的《Seam In Action》一书的第 9 章将解决对此主题的任何疑问。

    【讨论】:

    • 感谢您的回答!我将使用@In 注入持久性上下文。但是,我发现了一些与这部分相矛盾的附加信息:“@TransactionAttribute 对 Seam 托管事务没有影响。”根据 Seam 的 documentation,“如果您处于 EE 环境中,那么您应该始终使用 EJB API,即 @TransactionAttribute@ApplicationException。”
    • 另外,来自“Seam Framework Experience the Evolution of Java EE”一书,第 2 版,第 163 页:“不要将 @Transactional 注释与 EJB3 会话 bean 一起使用,请使用 @TransactionAttribute而是注释。”
    • 你说得对,奥斯卡。为了访问此页面的其他用户的利益,我编辑了响应。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2011-03-23
    • 2010-11-21
    • 2016-03-24
    相关资源
    最近更新 更多