首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >CDI中@Transactional的限制是什么?

CDI中@Transactional的限制是什么?
EN

Stack Overflow用户
提问于 2018-06-08 04:07:23
回答 1查看 972关注 0票数 2

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

代码语言:javascript
复制
@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);
    }
}

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

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

执行此操作需要

事务(使用事务或扩展持久性上下文)

我的印象是,从JavaEE7开始,@Transactional就可以使用CDI了。或者我只是遗漏了一些额外的配置?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-08 05:13:57

我将尝试给出一个简短的列表,在尝试让@Transactional与CDI一起工作时需要注意的事情,以便给出比注释更有价值的答案:

  1. 我们讨论的是javax.transaction.Transactional,而不是javax.ejb.TransactionAttribute,后者适用于EJB!
  2. 在非JEE中它不能开箱即用我们指的是那些运行完整的JEE应用服务器的应用程序;开箱即用的
    1. 不支持它!
    2. 要注意类路径问题,特别要确保当在完整的JEE应用服务器中运行时,不存在包含注释javax.transaction.Transactional的jar。如果您想在非完整的JEE环境中使用它,您将需要在classpath.
    3. @Transactional中使用它,并根据最新的JTA规范将其实现为一个CDI拦截器。因此:
      • 它不存在于JEE <7!
      • 中,它和任何拦截器都有相同的限制。例如,它不能被初始化器方法调用--这就是这个问题的问题所在,并且当调用this对象BEWARE!!!

    的方法时,它不会被激活

  1. 我非常确信可能存在更多错误!
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50749430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档