CDI中@Transactional的限制是什么?

时间:2018-06-07 20:07:23

标签: jpa java-ee ejb cdi

我试图在CDI类中使用@Transactional方法,而不是EJB:

@javax.inject.Named
// fails @javax.enterprise.context.ApplicationScoped
// fails @javax.enterprise.context.SessionScoped
// works @javax.ejb.Singleton
// works @javax.ejb.Stateless
public class SomeClass {
    @javax.persistence.PersistenceContext
    private EntityManager em;

    @javax.annotation.PostConstruct    
    @javax.transaction.Transactional
    public void someMethod() {
        em.persist(someEntity);
    }
}

当我使用SomeClass@Singleton注释@Stateless时,一切正常。

当我使用SomeClass@ApplicationScoped注释@SessionScoped时,WildFly 13会显示以下错误消息:

  

需要事务来执行此操作(使用事务或扩展持久性上下文)

自从Java EE 7以来@Transactional与CDI一起工作的印象让我错了?或者我只是缺少一些额外的配置?

1 个答案:

答案 0 :(得分:4)

我会尝试提供一个简短的列表,在尝试使@Transactional与CDI一起工作时要注意,以便给出答案比评论更有价值:

  1. 我们正在讨论适用于EJB的javax.transaction.Transactional,而不是javax.ejb.TransactionAttribute
  2. 在非JEE应用程序中它不是开箱即用的工具!
  3. JEE应用程序是指运行完整JEE应用程序服务器的应用程序;开箱即用的Tomcat不支持它!
  4. 小心类路径问题,特别是确保没有包含注释javax.transaction.Transactional的jar,例如在WEB-INF / lib。
  5. @Transactional通过最新的JTA规范实现为CDI拦截器。因此:
    • JEE< 7!
    • 它与任何拦截器具有相同的限制。例如。它不能被调用初始化方法 - @PostConstruct [这就是本问题中的问题],并且在调用this对象的方法时, NOT 被激活,请注意!
  6. 我非常有信心可能存在更多错误!!!