создать класс enum из таблицы с JOOQ

у меня есть следующая таблица под названием YNM:

 id  name
 1   YES
 2   NO 
 3   MAYBE

и хотите, чтобы JOOQ генерировал следующее перечисление java:

public enum YNM {
   YES,NO,MAYBE;
}

Я понимаю, что поддержка этого была отброшена в JOOQ 3 за чрезмерную сложность / антиинтуитивность. Есть ли способ достичь этого?

спасибо заранее.

2 ответов


конечно, вы можете повторно реализовать удаленный объект на вашей стороне в несколько шагов:

1. Реализуйте генератор для этого перечисления

вам нужно будет переопределить JavaGenerator реализовать генерацию кода для перевода ваших основных данных (может быть несколько таблиц) в перечисления. Как это работает, полностью зависит от вас, например, вы могли бы иметь:

  • таблицы основных данных с одним столбцом
  • сопоставление ID/VALUE таблицы
  • ID/VALUE / Comment mapping tables
  • другие макеты

2. Generate ForcedType конфигурации для этих перечислений

всякий раз, когда на такую таблицу основных данных ссылаются, вы должны повторно подключить столбец внешнего ключа к этому перечислению с помощью <forcedType/> конфигурации. это лучше всего сделать, настроив генерацию кода программно, так как это позволит вам иметь более динамический контроль над генерацией кода jOOQ конфигурация.

этот шаг более подробно описан в ответе Билла О'Нила.

3. Предотвращение создания таблиц основных данных

в дополнение к вышесказанному, вы, вероятно, должны удалить сами таблицы основных данных из сгенерированного вывода. В вашем случае, это должно привести к конфигурации:

<excludes>YNM</excludes>

или, если у вас есть более одной таблицы основных данных:

<excludes>YNM|OTHER_MASTER_DATA_TABLE|...</excludes>

кроме этих таблиц предотвратит доступ к ним из кода клиента jOOQ, а также удалит информацию о внешнем ключе в сгенерированном коде, что может привести к путанице.


Я думаю, вы должны иметь возможность использовать EnumConverter

public class YNMConverter extends EnumConverter<String, YNM > {

    public YNMConverter() {
        super(String.class, YNM.class);
    }
}

затем вам нужно будет добавить его в codegen как пользовательский тип и принудительный тип. Вот программный пример

new CustomType()
.withName("YNM")
.withType(YNM.class.getName())
.withConverter(YNMConverter.class.getName());

new ForcedType()
.withTypes("varchar")
.withName("YNM")
.withExpression(".*ynm.*") // regex to match the column name

вам нужно добавить принудительный тип и пользовательский тип в codegen. Это можно сделать в maven / xml или программно