2 votes

Est-il possible de remplacer les propriétés de persistence.xml par la configuration ?

JBOSS 5.1 / EJB 3 / JPA / MySQL

Pour le développement, nous spécifions "hibernate.hbm2ddl.auto" comme "update". Ceci est fait dans plusieurs fichiers persistence.xml incorporés dans plusieurs jars dans une oreille.

Pour la production, nous aimerions passer outre et spécifier "valider".

Cela peut-il se faire par une configuration externe à l'oreille ?

(Je sais qu'il est possible de faire cela en code dans un environnement non géré).

4voto

mtpettyp Points 3931

Pour JBoss 5.1, le fichier suivant doit être modifié :

<jboss_dir>/server/default/deployers/ejb3.deployer/META-INF/jpa-deployers-jboss-beans.xml

<bean name="PersistenceUnitDeployer" class="org.jboss.jpa.deployers.PersistenceUnitDeployer">
      <property name="defaultPersistenceProperties">
         <map keyClass="java.lang.String" valueClass="java.lang.String">
            <entry>
               <key>hibernate.transaction.manager_lookup_class</key>
               <value>org.hibernate.transaction.JBossTransactionManagerLookup</value>
            </entry>                
            <entry>
               <key>hibernate.hbm2ddl.auto</key>
               <value>validate</value>
            </entry>
            <entry>
               <key>hibernate.cache.provider_class</key>
               <value>org.hibernate.cache.HashtableCacheProvider</value>
            </entry>                
            <entry>
               <key>hibernate.jndi.java.naming.factory.initial</key>
               <value>org.jnp.interfaces.NamingContextFactory</value>
            </entry>
            <entry>
               <key>hibernate.jndi.java.naming.factory.url.pkgs</key>
               <value>org.jboss.naming:org.jnp.interfaces</value>
            </entry>
            <entry>
               <key>hibernate.bytecode.use_reflection_optimizer</key>
               <value>false</value>
            </entry>
            <!-- I don't think this is honored, but EJB3Deployer uses it -->
            <entry>
               <key>hibernate.bytecode.provider</key>
               <value>javassist</value>
            </entry>
         </map>
      </property>
</bean>

Ces propriétés peuvent être modifiées dans le fichier suivant dans JBoss 4.2 :

<jboss_dir>/server/default/deploy/ejb3.deployer/META-INF/persistence.properties

1voto

Osama ALASSIRY Points 794

Pour hibernate standalone, c'est facile à faire, lorsque vous créez l'objet de persistance, vous pouvez lui passer une table de hachage de paires clé-valeur. Dans votre cas la clé "hibernate.hbm2dll.auto" et la valeur de "validate"...

private Map properties = Util.newMap();

public EntityManagerFactory getEntityManagerFactory() {
    if (emf == null || !emf.isOpen()) {
        emf = Persistence.createEntityManagerFactory(PU, properties);
    }
    return emf;
}

public EntityManager getEntityManager() {
    if (em == null || !em.isOpen()) {
        em = getEntityManagerFactory().createEntityManager();
    }
    return em;
}

Je demanderais ensuite à ma classe de configuration de remplir la carte avec les éléments de mon fichier de configuration personnalisé.

Je ne pense pas que vous puissiez modifier une instance d'EntityManager déjà ouverte. Et bien que vous puissiez passer une Map à l'EntityManager, j'ai constaté qu'il ignorait ces propriétés et ne prêtait attention que lorsque vous le faisiez à partir de la Factory...

0voto

Archimedes Trajano Points 2729

Pour Wildfly, je recommanderais pour votre persistence.xml de ne pas avoir le hibernate.hbm2ddl.auto propriété du tout.

Au lieu de cela, dans la configuration de votre lanceur pour le développement où les arguments VM sont passés, ajoutez -Dhibernate.hbm2ddl.auto=update à la liste.

Vous pouvez avoir -Dhibernate.hbm2ddl.auto=validate pour vos environnements de production également, mais au moins cela permet de garder les changements en dehors de votre application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X