【问题标题】:JPA variable persistence unitsJPA 可变持久性单元
【发布时间】:2014-06-25 03:47:25
【问题描述】:

我正在尝试使用 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>

所以我的问题是,是否可以让 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

这让我相信无法在 glassfish 中解析环境变量 (???)

【问题讨论】:

  • 我不确定你为什么需要在 JBoss 中使用 java:/website,因为这在服务器之间是相当一致的。如果底层命名方案不同,将在您的 persistence.xml 中使用一个常量名称,例如 jdbc/website,然后使用服务器特定部署描述符中的资源引用链接更正它。见docs.jboss.org/jbossas/jboss4guide/r1/html/…docs.oracle.com/cd/E18930_01/html/821-2418/beaoa.html
  • 您提供的第二个链接让我对 glassfish 中的问题有了一个方便的了解,“java:”前缀是隐式的,所以我使用“jdbc/website”的地方实际上被解析为“ java:jdbc/website”因此使用“jboss/datasources/MySQLDS”并将引用重命名为 glassfish 中的引用应该(理论上)工作

标签: java mysql jpa jboss eclipselink


【解决方案1】:

在遵循上面第一条评论中提供的提示后,我得出结论认为这个问题是无关紧要的,我的问题是由于我对 glassfish、jboss 和 JPA 之间 JNDI 名称的显示/解析方式的不同理解引起的(在我的情况已经切换到休眠模式,因为 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 得到了相同的结果

【讨论】:

    猜你喜欢
    • 2013-02-15
    • 2021-02-17
    • 2013-04-18
    • 2013-09-06
    • 2014-03-28
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多