如何多次重复特定执行

时间:2009-09-07 06:43:30

标签: hibernate maven-2

以下代码段会在对JPA实体类进行修改时为特定数据库生成create / drop sql。

如何执行与'for'操作等效的操作,其中以下代码可用于为所有受支持的数据库生成sql(例如H2,MySQL,Postgres)

目前我每次都要修改db.groupId,db.artifactId,db.driver.version以生成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>

3 个答案:

答案 0 :(得分:0)

我假设您一次只有一个数据库处于活动状态。如果这是一个有效的假设,你实际上并不需要循环,而是需要能够在数据库之间切换。

您可以通过在配置文件中声明特定于数据库的属性来实现此目的,然后激活相关的配置文件。

下面的配置显示了如何为您提到的3个数据库设置配置文件,如果未指定,则使用默认值。您可以省略默认值,然后构建将失败,除非声明了配置文件。

您可以从命令行激活每个配置文件,如下所示:

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>

您可以根据环境变量的值激活配置文件,例如,如果ACTIVE_DB环境变量设置为“h2”,则下面的配置会激活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>

答案 1 :(得分:0)

可能采取的一些方向是:

1)调用一个Ant任务,它可以使用ant-tools来实现循环(虽然讨厌和XML密集)

2)编写自己的Maven插件(Mojo),在循环中包装Hibernate插件调用并获取一些参数。

查看Better Builds With Maven eBook了解更多详情。

答案 2 :(得分:0)

我会使用maven-antrun-plugin的集成ant解决方案或使用Maven Exec插件的自定义java类: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>

然后使用main方法编写一个java类com.yourcompany.DocBuilder(或其他),该方法将属性文件数组作为参数。你的java类可以嵌入ant或运行ant作为外部进程(如果这样做,你可能想要使用exec mojo而不是java mojo)

肖恩