2014-05-07 98 views
1

我正在尝试开发一个使用java EE的网站,该网站将部署到远程服务器,我正在尝试将JPA应用到应用程序中。
出于测试目的,我想创建一个变量持久性单元,以便在本地部署时,应用程序将使用我的本地mySQL服务器,而在远程部署时,它将使用服务器提供的mySQL服务器。然而,问题是我在glassfish本地运行,而jboss远程,所以我不能让数据源的资源JNDI名称相同(因为jboss需要“java:/”或“java:jboss” /”作为前缀,而GlassFish中不允许:的在JNDI名称)JPA可变持久性单元

的另一个问题是,我不是简单地不允许创建具有相同名称的2个持久性单元,
我试过做2个不同的持久性单元,但是由于其中一个持久性单元无法解析,部署失败。下面

是我此时的persistence.xml:

<persistence-unit name="LocalPU"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <jta-data-source>jdbc/website</jta-data-source> 
    <properties> 
     <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 
     <property name="eclipselink.ddl-generation.output-mode" value="both"/> 
    </properties> 
     </persistence-unit> 

<persistence-unit name="RemotePU"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <jta-data-source>java:/website</jta-data-source> 
    <properties> 
     <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 
     <property name="eclipselink.ddl-generation.output-mode" value="both"/> 
    </properties> 
</persistence-unit> 

所以我的问题是,是否有可能有一个EntityManager解决这些持久化单元的任一,但不要求两个持久性单元都可用

编辑:

张贴这个问题

约5分钟后,我发现,建议使用环境变量

然而,这似乎并没有为GlassFish中工作的文章,

这个persistence.xml中:

<persistence-unit name="LocalPU"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>${myds}</jta-data-source> 
     <properties> 
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 
      <property name="eclipselink.ddl-generation.output-mode" value="both"/> 
     </properties> 
</persistence-unit> 

并且JVM选项-Dmyds=jndi/website导致以下错误:

Exception while preparing the app : Invalid resource : ${myds}__pm 
com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Invalid resource : ${myds}__pm 

w这使我相信环境变量不能在玻璃鱼内解析(???)

+0

有相同的结果我不确定为什么你需要使用java:/网站在JBoss中,因为这是服务器之间相当一致的东西。如果底层的命名方案不同,那么将会做些什么,比如在persistence.xml中使用一个常量名,例如jdbc/website,然后用服务器特定的部署描述符中的resource-ref链接对其进行更正。请参阅http://docs.jboss.org/jbossas/jboss4guide/r1/html/ch3.chapter.html#ch3.ejbref.ex和http://docs.oracle.com/cd/E18930_01/html/821-2418 /beaoa.html – Chris

+0

您提供的第二个链接为我提供了一个方便的深入了解glassfish中的问题 “java:”前缀是隐含的,所以在我使用“jdbc/website”时它实际上被解析为“java :jdbc/website“ 因此,使用”jboss/datasources/MySQLDS“并重命名glassfish内的引用应该(理论上)工作 –

回答

0

在按照上面第一条评论提供的提示之后,我得出结论,这个问题是无关紧要的,而且我的问题是由我误解了glassfish,jboss和JPA之间JNDI名称的显示/解析方式不同(在我的情况下,由于openshift的Jboss服务器竟然不支持eclipselink,因此它不支持eclipselink)

Glassfish,命名为JNDI资源为jdbc/website,但解析为java:jdbc/website

另一方面,Jboss需要定义“java:”前缀因此为了寻找相同的数据源,它应该被命名为java:jdbc/website

我不完全确定JPA/Java EE如何在内部解析JNDI名称,但它看起来好像两个版本都有效,所以两者java:jdbc/websitejdbc/website将成功连接到glassfish和jboss环境中定义的数据源。 至少我已经能够使用java:jdbc/website数据源名称成功构建到jboss和glassfish,并且我已经与jdbc/website