我正在使用Seam构建一个Web应用程序,使用有状态会话EJB作为业务组件(也注释为Seam组件)。在这种情况下,使用@In或@PersistenceContext注入实体管理器的最佳实践是什么?这两个选项中的一个会导致我的问题吗? (假设对话的持续时间及其关联的持久性上下文不是问题)
如果我选择使用@In并且需要将方法标记为非事务性的,我应该使用@Transactional(TransactionPropagationType.SUPPORTS)还是@TransactionAttribute(TransactionAttributeType.SUPPORTS)?
答案 0 :(得分:2)
使用Seam托管持久性上下文而不是标准容器管理持久性上下文时,您不会遇到任何问题,因此在我看来,最佳做法是使用@In
。
使用Seam托管持久化上下文的优点包括:
<s:convertEntity>
(假设您将使用JSF)如果选择@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”将满足对此主题的任何疑问。