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

Posted

技术标签:

【中文标题】如何使用 JOOQ 使用 H2 为 PostGres 生成存根 - ENUM 类型【英文标题】:How use JOOQ to generate Stubs for PostGres using H2 - ENUM Type 【发布时间】:2019-01-08 07:44:31 【问题描述】:

在我的 CI 构建期间,我使用 JOOQ maven 插件为 PostGres 生成存根。 (我无法在 CI 旁边的容器中轻松旋转专用的 PostGres/Embedded 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 db 时,JOOQ 为 ENUM 的每个用法(!)生成一个 EnumType,而使用 PostGres 时只有一个 EnumType(这是我期望它的工作方式)。

例如:

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

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

我在两个表中使用这种类型,JOOQ 在 PostGre Modus 中使用 H2 生成两个枚举。

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

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

【问题讨论】:

【参考方案1】:

H2 的 enum 类型的当前(仍处于实验阶段)实现更多地对应于 mysql(per-table 类型)而不是 PostgreSQL(per-schema 类型),即使在 H2 中模拟了 CREATE TYPE 语句支持.有关详细信息,请参阅此问题: https://github.com/h2database/h2database/issues/1261

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

使用 H2 的附注

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

【讨论】:

关于旁注:testcontainers.org @JensSchauder:确实是的,我忘了提到那个选项。 Docker 也可能就足够了。 @LukasEder 感谢重播。我现在在 CI 构建期间使用 PostGres“Docker-in-Docker”,它现在工作正常。 Bwt:JOOQ 很棒 ;-) @geri-m:谢谢你的好话 :) 我很高兴这对你有用。我相信你不会后悔的。这将帮助您使用 H2 所没有的数百个非常酷的 PostgreSQL 功能(jOOQ 支持其中的许多功能!)

以上是关于如何使用 JOOQ 使用 H2 为 PostGres 生成存根 - ENUM 类型的主要内容,如果未能解决你的问题,请参考以下文章

JOOQ 从表中获取列

带有 h2 和 jooq 的 JdbcSQLSyntaxErrorException

JOOQ 可以为 H2/Postgresql 别名 Liquibase JSONB 数据类型吗

JOOQ 解析器问题(POSTGRES 到 H2 的翻译)

通过 gradle 配置 JOOQ Codegen 时找不到 H2 驱动程序

jooq无法在游戏中生成类 - scala