Во время сборки CI я генерирую заглушки, используя плагин JOOQ maven для PostGres. (Мне не удалось легко запустить выделенный PostGres / Embedded Postgres в контейнере рядом с моим CI-запуском). И H2 более удобен во время автоматизированных сборок / тестовых запусков.
Что я делаю, так это запускаю H2 в режиме PostGres, чтобы сгенерировать классы с помощью плагина 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. Где JOOQ генерирует EnumType для каждого использования (!) ENUM, когда базой является H2 db, при использовании PostGres существует только один EnumType (вот как я ожидал, что он будет работать).
Например:
Я создаю Enum Type в БД
create type state as enum ('start', 'stop')
и я использую этот тип в двух таблицах, JOOQ, использующий H2 в модусе PostGre, генерирует два перечисления.
Поэтому, если я переключаюсь между PostGres и H2, генерируются изменения кода и реализация.
Можно ли заставить JOOQ генерировать одни и те же классы, хотя базы данных разные?
Текущая (все еще довольно экспериментальная) реализация типа enum
H2 больше соответствует MySQL (тип для таблицы), чем PostgreSQL (тип для схемы), даже если поддержка оператора CREATE TYPE
эмулируется в H2. Подробнее см. В этом выпуске:
https://github.com/h2database/h2database/issues/1261
Итак, в нынешнем виде вы не можете эмулировать типы перечислений PostgreSQL на H2.
При этом, как только вы начнете использовать какие-либо специфические функции поставщика (а вам следует это сделать, потому что PostgreSQL великолепен и их множество), ваш подход к использованию H2, поскольку он кажется более легким, будет очень ошибочным. Вы будете сталкиваться с ограничениями, подобными этому, снова и снова, и потратите больше времени на их обход, чем если бы вы правильно настроили экземпляр PostgreSQL для этой задачи. Я настоятельно рекомендую не использовать H2 в вашем случае.
@JensSchauder: Да, действительно, я забыл упомянуть этот вариант. Докера тоже может быть достаточно.
@LukasEder спасибо за повтор. Теперь я использую PostGres «Docker-in-Docker» во время сборки CI, и теперь он отлично работает. Bwt: JOOQ потрясающий ;-)
@ geri-m: Спасибо за хорошие слова :) Я рад, что это сработало для вас. И я уверен, что вы не пожалеете об этом. Это поможет вам использовать сотни действительно интересных функций PostgreSQL, которых нет в H2 (а jOOQ поддерживает многие из них!)
Относительно примечания: testcontainers.org