繁体   English   中英

JPA变量持久性单元

[英]JPA variable persistence units

我正在尝试使用Java EE开发一个网站,该网站将部署到远程服务器,我正在尝试在应用程序中实现JPA。
为了进行测试,我想创建一个变量持久性单元,以便在本地部署中,应用程序将使用我的本地mySQL服务器,而在远程部署中,它将使用服务器提供的mySQL服务器。

但是问题是我在本地的glassfish上运行,并且jboss远程运行,因此我无法使数据源的资源JNDI名称相同(因为jboss需要将“ java:/”或“ java:jboss /”作为前缀,而glassfish不允许使用:的JNDI名称)

另一个问题是,我不能简单地创建两个具有相同名称的持久性单元,
我尝试制作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分钟后,我发现了一篇建议使用环境变量的文章

但是这似乎不适用于玻璃鱼,

这个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和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取得了相同的结果

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM