如何使用JOOQ使用H2-ENUM类型为PostGres生成存根

时间:2018-07-31 20:16:14

标签: postgresql enums h2 jooq

在构建CI期间,我使用PostGres的JOOQ maven插件生成存根。 (我无法在CI旁边的容器中轻松旋转专用的PostGres /嵌入式Postgres)。在自动构建/测试运行期间,H2更方便。

我要做的是,使用PostGres模式运行H2以使用maven插件生成类

  <plugin>
        <groupId>org.jooq</groupId>
        <artifactId>jooq-codegen-maven</artifactId>
        <version>3.11.3</version>

        <dependencies>
          <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>${h2.version}</version>
          </dependency>

          <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.4.jre7</version>
          </dependency>

        </dependencies>

        <executions>
          <execution>
            <id>jooq-codegen</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>generate</goal>
            </goals>
            <configuration>
              <jdbc>
                <driver>org.h2.Driver</driver>
                <url>jdbc:h2:./jooq;AUTO_SERVER=TRUE;MODE=PostgreSQL</url>
                <user>sa</user>
                <password></password>
              </jdbc>
              <generator>
                <name>org.jooq.codegen.JavaGenerator</name>
                <database>
                  <name>org.jooq.meta.h2.H2Database</name>
                  <includes>.*</includes>
                  <!-- we don't want the flyway stuff in the code -->
                  <excludes>Flyway_.*</excludes>
                  <inputSchema>PUBLIC</inputSchema>
                </database>

                <!-- Put the Custom Generator Code here -->
                <generate>
                  <deprecated>false</deprecated>
                  <instanceFields>true</instanceFields>
                  <pojos>true</pojos>


                </generate>
                <target>
                  <packageName>com.something.jooq</packageName>
                  <directory>target/generated-sources/jooq-h2</directory>
                </target>


              </generator>
            </configuration>
          </execution>
        </executions>
      </plugin>

这很好用,除非我以ENUM开头。当基础是H2数据库时,JOOQ为ENUM的每个用法(!)生成一个EnumType,而在使用PostGres时,只有一个EnumType(这是我期望的工作方式)。

例如:

我在数据库中创建一个枚举类型

create type state as enum ('start', 'stop')

并且我在两个表中使用此类型,在PostGre Modus中使用H2的JOOQ生成两个枚举。

因此,如果我在PostGres和H2之间切换,则会生成代码更改以及实现。

尽管数据库不同,是​​否可以强迫JOOQ生成相同的类?

1 个答案:

答案 0 :(得分:2)

即使enum语句支持,H2的CREATE TYPE类型的当前(仍处于试验阶段)实现比PostgreSQL(每个模式类型)与MySQL(每个表类型)更符合MySQL(每个表类型)的实现。在H2中模拟。有关详细信息,请参见此问题: https://github.com/h2database/h2database/issues/1261

因此,就目前而言,您无法在H2上模拟PostgreSQL的枚举类型。

使用H2的注意事项

话虽如此,一旦您使用任何供应商特定的功能(并且您应该这样做,因为PostgreSQL很棒并且有很多功能),您使用H2的方法(因为它似乎更容易)就存在很多缺陷。您将一次又一次遇到类似这样的限制,并且与为该任务正确设置PostgreSQL实例相比,将花费更多的时间来解决这些限制。我强烈建议您不要使用H2。