gpt4 book ai didi

jpa - CDI 中 @Transactional 有哪些限制?

转载 作者:行者123 更新时间:2023-12-02 06:48:05 25 4
gpt4 key购买 nike

我尝试在 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);
}
}

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

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

Transaction is required to perform this operation (either use a transaction or extended persistence context)

我的印象是,自 Java EE 7 起,@Transactional 就可以与 CDI 配合使用。我是否弄错了?或者我只是缺少一些额外的配置?

最佳答案

我将尝试给出一个简短的列表,列出在尝试使 @Transactional 与 CDI 一起使用时需要查看的内容,以便使答案比评论更有值(value):

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

关于jpa - CDI 中 @Transactional 有哪些限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50749430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com