我正在尝试使用 java EE 开发一个网站,该网站将部署到远程服务器,我正在尝试将 JPA 实现到应用程序中。
出于测试目的,我想创建一个可变持久性单元,以便在本地部署中,应用程序将使用我的本地 mySQL 服务器,而在远程部署中,它将使用服务器提供的 mySQL 服务器。
但问题是我在本地运行在 glassfish 上,而在远程运行在 jboss 上,所以我无法使数据源的资源 JNDI 名称相同(因为 jboss 需要“java:/”或“java:jboss/"作为前缀,而 glassfish 不允许在 JNDI 名称中使用 :'s)
另一个问题是我不能简单地创建 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>
所以我的问题是,是否可以让实体管理器解决这些持久性单元中的任何一个,但不要求两个持久性单元都可用
编辑:
发布这个问题大约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
这让我相信无法在 glassfish 中解析环境变量 (???)
最佳答案
在遵循上面第一条评论中提供的提示后,我得出结论,这个问题是无关紧要的,我的问题是由于我误解了 JNDI 名称在 glassfish、jboss 和 JPA 之间的显示/解析方式(在我的情况已经切换到 hibernate 状态,因为 openshift 的 Jboss 服务器毕竟不支持 eclipselink)
Glassfish,将 JNDI 资源命名为 jdbc/website
,但将其解析为 java:jdbc/website
另一方面,Jboss 需要显式定义“java:”前缀,因此为了寻址相同的数据源,它应该命名为 java:jdbc/website
我不完全确定 JPA/Java EE 如何在内部解析 JNDI 名称,但似乎这两个版本都有效,所以 java:jdbc/website
和 jdbc/website
将成功连接到 glassfish 和 jboss 环境中定义的数据源。
至少我已经能够使用 java:jdbc/website
数据源名称成功构建到 jboss 和 glassfish,并且我用 jdbc/website
得到了相同的结果>
关于java - JPA 变量持久化单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23530125/