Как использовать JOOQ для создания заглушек для PostGres с использованием типа H2 - ENUM

Во время сборки 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 генерировать одни и те же классы, хотя базы данных разные?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
748
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Текущая (все еще довольно экспериментальная) реализация типа enum H2 больше соответствует MySQL (тип для таблицы), чем PostgreSQL (тип для схемы), даже если поддержка оператора CREATE TYPE эмулируется в H2. Подробнее см. В этом выпуске: https://github.com/h2database/h2database/issues/1261

Итак, в нынешнем виде вы не можете эмулировать типы перечислений PostgreSQL на H2.

Боковое примечание по использованию H2

При этом, как только вы начнете использовать какие-либо специфические функции поставщика (а вам следует это сделать, потому что PostgreSQL великолепен и их множество), ваш подход к использованию H2, поскольку он кажется более легким, будет очень ошибочным. Вы будете сталкиваться с ограничениями, подобными этому, снова и снова, и потратите больше времени на их обход, чем если бы вы правильно настроили экземпляр PostgreSQL для этой задачи. Я настоятельно рекомендую не использовать H2 в вашем случае.

Относительно примечания: testcontainers.org

Jens Schauder 02.08.2018 10:59

@JensSchauder: Да, действительно, я забыл упомянуть этот вариант. Докера тоже может быть достаточно.

Lukas Eder 02.08.2018 11:00

@LukasEder спасибо за повтор. Теперь я использую PostGres «Docker-in-Docker» во время сборки CI, и теперь он отлично работает. Bwt: JOOQ потрясающий ;-)

geri-m 02.08.2018 18:22

@ geri-m: Спасибо за хорошие слова :) Я рад, что это сработало для вас. И я уверен, что вы не пожалеете об этом. Это поможет вам использовать сотни действительно интересных функций PostgreSQL, которых нет в H2 (а jOOQ поддерживает многие из них!)

Lukas Eder 02.08.2018 18:35

Другие вопросы по теме