我正在尝试开发一个使用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这使我相信环境变量不能在玻璃鱼内解析(???)
有相同的结果我不确定为什么你需要使用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
您提供的第二个链接为我提供了一个方便的深入了解glassfish中的问题 “java:”前缀是隐含的,所以在我使用“jdbc/website”时它实际上被解析为“java :jdbc/website“ 因此,使用”jboss/datasources/MySQLDS“并重命名glassfish内的引用应该(理论上)工作 –