Jpa CDI中@Transactional的限制是什么?
我试图在CDI类中使用Jpa CDI中@Transactional的限制是什么?,jpa,jakarta-ee,ejb,cdi,Jpa,Jakarta Ee,Ejb,Cdi,我试图在CDI类中使用@Transactional方法,而不是EJB: @javax.inject.Named //失败@javax.enterprise.context.ApplicationScoped //失败@javax.enterprise.context.SessionScoped //works@javax.ejb.Singleton //works@javax.ejb.Stateless 公共类{ @javax.persistence.PersistenceContext 私人实
@Transactional
方法,而不是EJB:
@javax.inject.Named
//失败@javax.enterprise.context.ApplicationScoped
//失败@javax.enterprise.context.SessionScoped
//works@javax.ejb.Singleton
//works@javax.ejb.Stateless
公共类{
@javax.persistence.PersistenceContext
私人实体管理者;
@javax.annotation.PostConstruct
@javax.transaction.Transactional
公共方法(){
em.persist(someEntity);
}
}
当我用@Singleton
或@Stateless
注释SomeClass
时,一切正常
当我用@ApplicationScoped
或@SessionScoped
注释SomeClass
时,WildFly 13显示以下错误消息:
执行此操作需要事务(使用事务或扩展持久性上下文)
我的印象是,
@Transactional
从JavaEE7开始就与CDI一起工作。我弄错了吗?或者我只是缺少了一些额外的配置?我将尝试给出一个简短的列表,列出在尝试使@Transactional
与CDI一起工作时要查看的内容,以便让答案比注释更有价值:
javax.transaction.Transactional
,而不是javax.ejb.TransactionAttribute
,它适用于ejb李>
javax.transaction.Transactional
的jar,例如在WEB-INF/lib中。如果您想在非完整JEE环境中使用它,您需要将它放在类路径中@Transactional
由最新的JTA规范作为CDI拦截器实现。像这样的:
- 它不在JEE<7李>
- 它具有与任何拦截器相同的限制。例如,不能为初始值设定项方法调用它-
[这是这个问题中的问题],并且在调用@PostConstruct
对象的方法时,它不会被激活,小心李>这个