代码之家  ›  专栏  ›  技术社区  ›  fredoverflow

cdi中@transactional的限制是什么?

  •  1
  • fredoverflow  · 技术社区  · 7 年前

    我想用一个 @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 ,一切正常。

    当我注释时 身体类 具有 @ApplicationScoped @SessionScoped ,Wildfly 13显示以下错误消息:

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

    我的印象是 @事务性 从Java EE 7起与CDI一起工作。我弄错了吗?或者我只是缺少一些额外的配置?

    1 回复  |  直到 7 年前
        1
  •  4
  •   Nikos Paraskevopoulos    7 年前

    我试着列出一个简短的清单 @Transactional 使用cdi,使答案比注释更有价值:

    1. 我们在讨论 javax.transaction.Transactional 不是 javax.ejb.TransactionAttribute ,这对ejb有效!
    2. 在非jee应用程序中,它不是现成的!
    3. 我们所说的jee应用程序是指那些运行完整jee应用服务器的应用程序;tomcat开箱即用不支持它!
    4. 小心类路径问题,特别是确保没有包含注释的jar javax.transaction.transactional事务 存在于WEB-INF/lib中。
    5. @事务性 由最新的JTA规范实现为CDI拦截器。像这样的:
      • 它不在那里在吉伊<7!
      • 它具有与任何拦截器相同的限制。例如,不能为初始值设定项方法调用它- @PostConstruct [这是这个问题的问题],它是 不是 调用的方法时激活 this 物体,小心!!!!
    6. 我很有信心会有更多的错误!!!!