создать класс 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 или программно