【问题标题】:Persistence.createEntityManagerFactory() in Java EE ignores JTA sourceJava EE 中的 Persistence.createEntityManagerFactory() 忽略 JTA 源
【发布时间】:2010-12-13 03:30:13
【问题描述】:

我有一个完美运行的应用程序客户端部署到带有一些 EJB、实体等的 GlassFish v2 服务器上。我正在使用 eclipselink。

目前我的persistence.xml中有:

<persistence-unit name="mysource">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>jdbc/mysource</jta-data-source>
    <class>entities.one</class>
    <class>entities.two</class>
    ...
    <properties>
      <property name="eclipselink.target-server" value="SunAS9"/>
      <property name="eclipselink.logging.level" value="FINE"/>
    </properties>
</persistence-unit>

当我将EntityManager 注入 EJB 时,这可以正常工作:

@PersistenceContext(unitName="mysource")
private EntityManager em;

现在我需要动态切换持久性单元/数据库。 我想我可以通过编程方式获得EntityManager

em = Persistence.createEntityManagerFactory("mysource").createEntityManager();

但我收到以下错误:

Unable to acquire a connection from driver [null], user [null] and URL [null]

即使在 Map 中将 javax.persistence.jtaDataSource“覆盖”到“jdbc/mysource”并调用 createEntityManagerFactory("mysource", map) 也没有什么不同。

我错过了什么?

【问题讨论】:

  • 这应该可以工作,并且您的 persistence.xml 看起来是正确的。检查您的类路径中是否没有多个 persistence.xml。

标签: jpa connection persistence glassfish


【解决方案1】:

您试图通过以编程方式创建实体管理器来绕过容器,这意味着您很可能会创建一个非 JTA 数据源(因为它在容器之外,事务类型应该是 RESOURCE_LOCAL),因此您的原始配置没用。

尝试注入具有不同 unitName 属性的实体管理器或创建 RESOURCE_LOCAL 事务类型持久性单元。

【讨论】:

  • 我正在 尝试 做的正是注释所做的,但在代码中,我可以以编程方式设置 unitName。我基本上只是想按名称向容器询问给定 PU 的实体管理器。如果有其他方法可以做到这一点(即没有 createEntityManagerFactory),那很好。
猜你喜欢
  • 2011-10-27
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 2014-04-12
  • 2015-07-14
相关资源
最近更新 更多