2009-09-07 11 views
3

L'extrait suivant génère un code SQL créer/supprimer pour une base de données particulière, chaque fois qu'une modification est apportée aux classes d'entités JPA.Comment répéter une exécution particulière plusieurs fois

Comment puis-je effectuer quelque chose d'équivalent d'un « pour » opération où dans le code suivant peut être utilisé pour générer des requêtes SQL pour toutes les bases de données prises en charge (par exemple H2, MySQL, Postgres)

Actuellement je modifier db .groupId, db.artifactId, à chaque fois de db.driver.version pour générer les fichiers sql

  <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>hibernate3-maven-plugin</artifactId> 
       <version>${hibernate3-maven-plugin.version}</version> 

       <executions> 
        <execution> 
         <id>create schema</id> 
         <phase>process-test-resources</phase> 
         <goals> 
          <goal>hbm2ddl</goal> 
         </goals> 
         <configuration> 
          <componentProperties> 
           <persistenceunit>${app.module}</persistenceunit> 
           <drop>false</drop> 
           <create>true</create> 
           <outputfilename>${app.sql}-create.sql</outputfilename> 
          </componentProperties> 
         </configuration> 
        </execution> 
        <execution> 
         <id>drop schema</id> 
         <phase>process-test-resources</phase> 
         <goals> 
          <goal>hbm2ddl</goal> 
         </goals> 
         <configuration> 
          <componentProperties> 
           <persistenceunit>${app.module}</persistenceunit> 
           <drop>true</drop> 
           <create>false</create> 
           <outputfilename>${app.sql}-drop.sql</outputfilename> 
          </componentProperties> 
         </configuration> 
        </execution> 
       </executions> 

       <dependencies> 
        <dependency> 
         <groupId>org.hibernate</groupId> 
         <artifactId>hibernate-core</artifactId> 
         <version>${hibernate-core.version}</version> 
        </dependency> 

        <dependency> 
         <groupId>org.slf4j</groupId> 
         <artifactId>slf4j-api</artifactId> 
         <version>${slf4j-api.version}</version> 
        </dependency> 

        <dependency> 
         <groupId>org.slf4j</groupId> 
         <artifactId>slf4j-nop</artifactId> 
         <version>${slf4j-nop.version}</version> 
        </dependency> 

        <dependency> 
         <groupId>${db.groupId}</groupId> 
         <artifactId>${db.artifactId}</artifactId> 
         <version>${db.driver.version}</version> 
        </dependency> 
       </dependencies> 

       <configuration> 
        <components> 
         <component> 
          <name>hbm2cfgxml</name> 
          <implementation>annotationconfiguration</implementation> 
         </component> 
         <component> 
          <name>hbm2dao</name> 
          <implementation>annotationconfiguration</implementation> 
         </component> 
         <component> 
          <name>hbm2ddl</name> 
          <implementation>jpaconfiguration</implementation> 
          <outputDirectory>src/main/sql</outputDirectory> 
         </component> 
         <component> 
          <name>hbm2doc</name> 
          <implementation>annotationconfiguration</implementation> 
         </component> 
         <component> 
          <name>hbm2hbmxml</name> 
          <implementation>annotationconfiguration</implementation> 
         </component> 
         <component> 
          <name>hbm2java</name> 
          <implementation>annotationconfiguration</implementation> 
         </component> 
         <component> 
          <name>hbm2template</name> 
          <implementation>annotationconfiguration</implementation> 
         </component> 
        </components> 
       </configuration> 
      </plugin> 

Répondre

0

Je suppose que vous ne disposez que d'une base de données active à la fois. Si cette hypothèse est valide, vous n'avez pas vraiment besoin d'une boucle, mais vous devez pouvoir basculer entre les bases de données.

Vous pouvez réaliser cela en déclarant les propriétés spécifiques à la base de données dans les profils, puis activer le profil approprié.

La configuration ci-dessous montre comment définir les profils pour les 3 bases de données que vous mentionnez, et utiliser une valeur par défaut dans le cas où aucune n'est spécifiée. Vous pouvez omettre la valeur par défaut et la construction échouera à moins qu'un profil ne soit déclaré.

Vous souhaitez activer chaque profil de la ligne de commande comme suit:

mvn test -P h2 
mvn test -P mysql 
mvn test -P postgresql 

<profiles> 
    <profile> 
    <id>h2</id> 
    <properties> 
     <db.groupId>com.h2database</db.groupId> 
     <db.artifactId>h2</db.artifactId> 
     <db.version>1.1.117</db.version> 
    </properties> 
    </profile> 
    <profile> 
    <id>mysql</id> 
    <properties> 
     <db.groupId>mysql</db.groupId> 
     <db.artifactId>mysql-connector-java</db.artifactId> 
     <db.version>5.1.6</db.version> 
    </properties> 
    </profile> 
    <profile> 
    <id>postgresql</id> 
    <properties> 
     <db.groupId>postgresql</db.groupId> 
     <db.artifactId>postgresql</db.artifactId> 
     <db.version>8.3-603.jdbc4</db.version> 
    </properties> 
    </profile> 
</profiles> 
... 
<!--default database, say mysql--> 
<properties> 
    <db.groupId>mysql</db.groupId> 
    <db.artifactId>mysql-connector-java</db.artifactId> 
    <db.version>5.1.6</db.version> 
</properties> 

Vous pouvez activer un profil en fonction de la valeur d'une variable d'environnement, par exemple la configuration active sous le profil de h2 si le ACTIVE_DB La variable d'environnement est définie sur "h2".

<profile> 
    <id>h2</id> 
    <activation> 
     <property> 
     <name>ACTIVE_DB</name> 
     <value>h2</value> 
     </property> 
    </activation> 
    <properties> 
     <db.groupId>com.h2database</db.groupId> 
     <db.artifactId>h2</db.artifactId> 
     <db.version>1.1.117</db.version> 
    </properties> 
    </profile> 
+0

Rich - J'ai une base de données actif à la fois et j'utilise les profils pour basculer entre eux. Je n'utilise pas la capacité hbm2ddl.auto pour générer mon SQL dynamiquement, mais j'utilise le plugin hbm2ddl pour générer des scripts pour toutes les bases de données supportées et les pré-charger avant le démarrage. Par conséquent, j'aurais besoin de la possibilité de générer tout le SQL de création/suppression pour toutes les bases de données prises en charge en une seule fois. J'espère que cela clarifie. – Joe

+0

Ok, je vois le problème, je n'ai pas de configuration pour tester ça. Inspecter le code du plugin indique qu'il n'y a pas de mécanisme intégré pour le faire –

0

Certaines directions possibles à prendre sont:

1) appeler à une tâche Ant qui peut utiliser des fourmis-outils pour implémenter des boucles (méchant et XML intensive bien)

2) écrire votre propre plugin Maven (Mojo) qui encapsule les appels du plugin Hibernate dans une boucle et prend quelques paramètres. Pour plus de détails, consultez le Better Builds With Maven eBook.

0

Je voudrais aller soit avec une solution de fourmi intégrée en utilisant maven-antrun-plugin ou une classe java personnalisé à l'aide Maven Exec Plugin ici: http://mojo.codehaus.org/exec-maven-plugin/java-mojo.html

<build> 
<plugins> 
    <plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <executions> 
     <execution> 
     <goals> 
      <goal>java</goal> 
     </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <mainClass>com.yourcompany.DocBuilder</mainClass> 
     <arguments> 
     <argument>propertyFile1.properties</argument> 
     <argument>propertyFile2.properties</argument> 
     <argument>propertyFile3.properties</argument> 
     <argument>propertyFile4.properties</argument> 
     </arguments> 
    </configuration> 
    </plugin> 
</plugins> 

écrire ensuite une classe java com. yourcompany.DocBuilder (ou autre) avec une méthode principale qui prend en paramètre le tableau des fichiers de propriétés. Votre classe java peut intégrer fourmi ou exécuter ant comme un processus externe (si vous faites cela, vous voudrez probablement utiliser l'exec Mojo au lieu du mojo java)

Sean

Questions connexes