Java EE中的Persistence.createEntityManagerFactory()忽略JTA源

时间:2009-11-04 18:42:05

标签: jpa connection persistence glassfish

我有一个完美的应用程序客户端部署到一个带有一些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)并没有什么区别。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

您正试图以编程方式创建实体管理器来规避容器,这意味着您很可能会创建非JTA数据源(因为它位于容器外部,事务类型应为RESOURCE_LOCAL),因此您的原始配置是没用的。

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