以下代码段会在对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>
答案 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)
肖恩