2014-05-07 5 views
1

Je suis en train de développer un site Web utilisant java EE, qui sera déployé sur un serveur distant, j'essaie d'implémenter JPA dans l'application.
À des fins de test, j'aimerais créer une unité de persistance variable, de sorte que sur le déploiement local, l'application utilise mon serveur mySQL local, alors que sur le déploiement distant, elle utilisera le serveur mySQL fourni par le serveur. Le problème est cependant que je cours sur glassfish localement, et jboss distant, donc je ne peux pas rendre les noms JNDI de ressource pour les sources de données identiques (puisque jboss requiert "java: /" ou "java: jboss")/» comme préfixe, alors que GlassFish ne permet pas: 's dans les noms JNDI)unités de persistance variable JPA

un autre problème est que je ne suis pas simplement permis de créer 2 unités de persistance du même nom,
j'ai essayé de faire 2 unités de persistance différentes, mais le déploiement échoue car l'une des unités de persistance ne peut pas être résolue.

ci-dessous est mon persistence.xml à ce moment:

<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> 

donc ma question est, est-il possible d'avoir une volonté de entitymanager à l'une de ces unités de persistance, mais n'exige pas que les deux unités de persistance soient disponibles

EDIT:

environ 5 minutes après la publication de cette question, je l'ai trouvé un article qui suggère d'utiliser des variables d'environnement

cependant

cela ne semble pas travailler dans GlassFish,

ce 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> 

et la machine virtuelle Java-options -Dmyds=jndi/website résultats dans l'erreur suivante:

Exception while preparing the app : Invalid resource : ${myds}__pm 
com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Invalid resource : ${myds}__pm 

w ce qui m'amène à croire que les variables d'environnement ne peuvent pas être analysées dans glassfish (???)

+0

Je ne sais pas pourquoi vous devez utiliser java:/site dans JBoss, car c'est quelque chose qui est assez cohérent entre les serveurs. Ce qui serait fait si le schéma de nommage sous-jacent est différent est d'utiliser un nom constant dans votre persistence.xml, jdbc/site web par exemple, et de le corriger avec des liens resource-ref dans des descripteurs de déploiement spécifiques au serveur. Voir http://docs.jboss.org/jbossas/jboss4guide/r1/html/ch3.chapter.html#ch3.ejbref.ex et http://docs.oracle.com/cd/E18930_01/html/821-2418 /beaoa.html – Chris

+0

le deuxième lien que vous avez fourni m'a donné un aperçu pratique de la question apparemment dans glassfish, le "java:" préfixe est implicite, donc où j'utilise "jdbc/site Web" il est réellement analysé comme "java : jdbc/website " donc en utilisant" jboss/datasources/MySQLDS "et en renommant la référence à cela dans glassfish devrait (en théorie) fonctionner –

Répondre

0

après avoir suivi les conseils fournis dans le premier commentaire ci-dessus, j'ai conclu que la question n'est pas pertinente, et que mes problèmes ont été causés par mon incompréhension de la façon dont les noms JNDI sont affichés/analysés différemment entre glassfish, jboss et JPA (dans mon cas, il est passé en hibernation, car les serveurs JBoss de openshift ne sont pas compatibles avec eclipselink)

Glassfish, nomme le JNDI ressource comme jdbc/website, mais analyse encore comme java:jdbc/website

Jboss, d'autre part, nécessite le préfixe "java:" à définir Je ne suis pas tout à fait sûr de savoir comment JPA/Java EE analysent les noms JNDI en interne, mais il semble que l'une ou l'autre version fonctionne, donc les deux java:jdbc/website ET jdbc/website se connecte avec succès à la source de données définie à la fois dans l'environnement glassfish et l'environnement jboss. au moins que je suis en mesure de construire avec succès à la fois jboss et glassfish en utilisant le nom java:jdbc/website de source de données, et je l'ai eu le même résultat avec jdbc/website

Questions connexes