使用Seam在SFSB中注入实体管理器

时间:2011-03-02 19:06:48

标签: transactions dependency-injection entity seam ejb

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

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

1 个答案:

答案 0 :(得分:2)

使用Seam托管持久性上下文而不是标准容器管理持久性上下文时,您不会遇到任何问题,因此在我看来,最佳做法是使用@In。 使用Seam托管持久化上下文的优点包括:

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

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

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

如果您使用的是EJB3并标记您的类或方法@TransactionAttribute(REQUIRES_NEW) 那么事务和持久化上下文不应该传播给方法调用 宾语。但是,由于Seam管理的持久性上下文传播到任何组件 在对话中,它将传播到标记为REQUIRES_NEW的方法。因此, 如果您标记方法REQUIRES_NEW,则应使用以下方法访问实体管理器 @PersistenceContext

Dan Allen的第9章“Seam In Action”将满足对此主题的任何疑问。