gpt4 book ai didi

postgresql - 如何使用 JOOQ 使用 H2 为 PostGres 生成 stub - ENUM 类型

转载 作者:行者123 更新时间:2023-11-29 12:02:14 25 4
gpt4 key购买 nike

在我的 CI 构建过程中,我使用 JOOQ maven 插件为 PostGres 生成 stub 。 (我无法轻松地在我的 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 数据库时,JOOQ 为 ENUM 的每个用法(!)生成一个 EnumType,而使用 PostGres 时只有一个 EnumType(这就是我期望它的工作方式)。

例如:

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

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

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

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

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

最佳答案

H2 的 enum 类型的当前(仍然是实验性的)实现更多地对应于 MySQL(每表类型)而不是 PostgreSQL(每模式类型),即使 CREATE TYPE 语句支持在 H2 中被模拟。详情见本期: https://github.com/h2database/h2database/issues/1261

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

关于使用 H2 的附注

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

关于postgresql - 如何使用 JOOQ 使用 H2 为 PostGres 生成 stub - ENUM 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51621385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com