我有一个基于Maven的Java EE项目,应该在GlassFish v3上运行。有一个注入EJB服务的JSF ManagedBean。 ManagedBean调用其中一些JPA操作发生时按钮单击的注入EJB方法之一(创建新实体对象,持久化,刷新)。时调用的EntityManager.flush()
则抛出异常:Java EE:Eclipselink事务丢失
Caused by: javax.persistence.TransactionRequiredException: Exception
Description: No transaction is currently active
数据源是与JTA事务类型(persistence.xml中所定义的)一个JTA数据源。
我已经找到了解决方案,但由于部署问题而不能令人满意。 如果我把代码的下一行成的persistence.xml然后它运行没有任何问题:
<property name="eclipselink.target-server" value="SunAS9"/>
因为这个原因,我认为它是一个部署问题,当的EclipseLink不承认JTA经理。
任何建议,将不胜感激,谢谢你!
UPDATE:
@MRalwasser:这里是完整的堆栈跟踪。 (对不起,我不得不删除真正的软件包名称,它现在是masked.package.name)stack trace on pastebin
@Chris:对不起,我忘了提及,GeneriDao类通过工厂方法创建实体管理器,而不是依赖注入。
你能向我们展示异常的完整堆栈跟踪吗? – MRalwasser 2013-03-11 17:53:56
除非容器管理持久性单元,以便将所需属性注入到上下文中,否则需要告知EclipseLink如何查找JTA事务管理器和数据源(如果特定于服务器)。即如果使用javax.persistence.Persistence.getEntityManagerFactory而不是注入 – Chris 2013-03-11 20:29:53
为什么不能使用'eclipselink.target-server'?无论是在persistence.xml中,还是在创建时通过属性重写。没有这个属性,我遇到了各种类加载器问题,包括非活动事务。 – Jarekczek 2017-06-13 13:58:24