gpt4 book ai didi

jakarta-ee - Java EE : Eclipselink transaction missing

转载 作者:行者123 更新时间:2023-12-03 16:24:54 25 4
gpt4 key购买 nike

我有一个基于 Maven 的 Java EE 项目,应该在 GlassFish v3 上运行。有一个注入(inject) EJB 服务的 JSF ManagedBean。 ManagedBean 在发生一些 JPA 操作(创建新实体对象、持久化、刷新)的按钮单击时调用注入(inject)的 EJB 方法之一。当EntityManager.flush()调用然后它抛出一个异常:

Caused by: javax.persistence.TransactionRequiredException:  Exception
Description: No transaction is currently active

数据源是具有 JTA 事务类型的 jta 数据源(在 persistence.xml 中定义)。

我已经找到了解决方案,但由于部署问题,它并不令人满意。
如果我将下一行代码放入persistence.xml,那么它运行没有任何问题:
<property name="eclipselink.target-server" value="SunAS9"/>

由于这个原因,我假设这是一个部署问题,当 eclipselink 无法识别 JTA 管理器时。

任何建议将不胜感激,谢谢!

更新:

@MRalwasser:这是完整的堆栈跟踪。 (对不起,我不得不删除真正的包名,现在是 masked.package.name) stack trace on pastebin

@Chris:对不起,我忘了提,GeneriDao 类通过工厂方法创建实体管理器,而不是通过依赖注入(inject)。

最佳答案

默认情况下,只有 EJB 可以在 CMT 中工作。在托管 bean 或 CDI bean 中,您必须实现自己的机制来处理事务并在其中运行您的服务。

public class ManagedBean {        

@Inject
yourEjbService service;

@Resource
UserTransaction utx;

public void save(){
try{
utx.begin();
service.doAction();
utx.commit();
} catch (Exception e) {
try {
utx.rollback();
} catch (Exception ex) {
...
}
}
}
...
}

您也不必调用 EntityManager.flush()如果您使用 @PersistenceContext 注入(inject) EntityManager,则不在您的 EJB 或托管 bean 中.它会在 EJB 中的每个方法结束后自动分离实体。

关于jakarta-ee - Java EE : Eclipselink transaction missing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15341128/

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