2009-11-04 47 views
3

我有一个完美工作的应用程序客户端,部署到GlassFish v2服务器中,并与某些EJB,实体等一起使用。我正在使用eclipselink。Java EE中的Persistence.createEntityManagerFactory()忽略JTA源

目前我有我的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)不会有所作为。

我缺少什么?

+0

这应该工作,你的persistence.xml看起来是正确的。检查你的类路径中没有多个persistence.xml。 – James 2013-04-08 13:46:00

回答

1

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

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

+0

我正在尝试*做的是注释所做的事情,但是在代码中,我可以通过编程方式设置unitName。我基本上只是想问一个实体经理的容器名称给定的PU。如果还有其他方法可以做到这一点(即没有createEntityManagerFactory),那很好。 – Draemon 2009-11-13 16:43:53