hibernate - 如何多次重复执行特定命令

标签 hibernate maven-2

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

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

目前,我必须每次修改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>

最佳答案

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

您可以通过在概要文件中声明特定于DB的属性,然后激活相关概要文件来实现。

下面的配置显示了如何为您提到的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>

关于hibernate - 如何多次重复执行特定命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1387873/

相关文章:

java - Maven exec 插件-当 classpathscope=test 时如何从 main/java 导入类

java - Hibernate 4 不同和一起排序

java - 将 java.util.Date 转换为 YYYY-MM-DD HH :MM:SS format to compatible with MySQL DATETIME

java - 在 EJB mdb 中初始化 Hibernate SessionFactory?

maven-2 - 来自另一个模块的 Maven 模块属性

maven-2 - tomcat :run goal 的附加上下文

java - Eclipse 中使用 Maven 的多项目应用程序

mysql - 使用 EntityManager 刷新时实体继承出错

java - Maven - 一个包的多个模块

maven - 禁用重新部署时如何 Maven 发布多个配置文件项目