java - JPA 变量持久化单元

标签 java mysql jpa jboss eclipselink

我正在尝试使用 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/websitejdbc/website 将成功连接到 glassfish 和 jboss 环境中定义的数据源。 至少我已经能够使用 java:jdbc/website 数据源名称成功构建到 jboss 和 glassfish,并且我用 jdbc/website 得到了相同的结果>

关于java - JPA 变量持久化单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23530125/

相关文章:

mysql - 使用 socket.io 在 Node.js 中使用 MySql 数据库记录 HTML5 页面

java - @Transactional 不适用于 JPA 实体

java - 从数据库读取时为 "Operation not allowed after ResultSet closed"

java - 如何公开第三方类(class)?

mysql - 通过jsp向表插入值的问题

spring - JPA 和 Hibernate Cascade DELETE OneToMany 不起作用

java - 没有 setter 的 JPA 2.0 持久属性

java - 方法声明中参数声明之前的 final 关键字

Java 时区从 EDT 到 EST 的过渡期

javascript - 使用 Ember.js 从 Laravel 后端加载 Mysql 数据