Как я могу расширить генератор кода JOOQ?

Я хотел бы сделать наши записи JOOQ более безопасными. Например, я бы хотел, чтобы поля BIGINT CUSTOMER.ID и ORDER.CUSTOMER_ID имели тип CustomerNo, а не просто Long.

Я могу заставить генератор кода JOOQ генерировать правильные поля, используя комбинацию customType forcedType:

public final TableField<CustomerRecord, CustomerNo> ID = 
  createField("ID", SQLDataType.BIGINT.asConvertedDataType(new CustomerNoConverter()), this);

public final TableField<OrderRecord, CustomerNo> CUSTOMER_ID = 
  createField("CUSTOMER_ID", SQLDataType.BIGINT.asConvertedDataType(new CustomerNoConverter()), this);

Однако этого недостаточно. Для каждого первичного ключа с одним полем типа Long мне нужно создать два класса, то есть эквиваленты CustomerNo и CustomerNoConverter. Конечно, наиболее удобный способ сделать это - использовать метамодель JOOQ, чтобы перебрать любые такие поля и сгенерировать код для каждого из них.

Поскольку сама модель JOOQ зависит от классов, которые должны быть сгенерированы, мне нужно будет подключиться к генератору кода JOOQ. Однако мне не удалось найти подходящий механизм обратного вызова для этой задачи. Как я мог подойти к этой проблеме?


person blubb    schedule 16.10.2015    source источник


Ответы (1)


Ожидается запрос функции # 2574 и некоторые связанные идеи, направленные на создание генератора кода классы для каждого кортежа первичного ключа / внешнего ключа, что было бы весьма полезно для некоторой дополнительной проверки типов при выражении запросов.

А пока вы всегда можете расширить jOOQ JavaGenerator и добавить к нему несколько дополнительных классов. Например, есть «раздел пользовательского кода» раздел, куда вы можете поместить свой собственный код. Включая, например, ваши пользовательские вложенные классы. Результат может быть примерно таким:

public class Customer extends TableImpl<CustomerRecord> {
    public final TableField<CustomerRecord, CustomerNo> ID = 
      createField("ID", SQLDataType.BIGINT.asConvertedDataType(new CustomerNoConverter()), this);
    ...

    // Your additional genererated code here
    public static class CustomerNo {
        public final Long ID;
    }

    public static class CustomerNoConverter implements Converter<Long, CustomerNo> {
        ...
    }
}

Затем вместо использования конфигурации XML используйте программную конфигурацию для создания всех customTypes / forceTypes.

person Lukas Eder    schedule 16.10.2015
comment
Да, это та часть, которую я уже понял :) Мой вопрос относительно автоматизации создания ‹Table› Нет классов для ›500 таблиц ... - person blubb; 16.10.2015
comment
Что ж, это регулярное выражение. Вы можете сопоставить что угодно. Вроде .*?\.CUSTOMER_ID. Если вы предоставите дополнительную информацию о своей схеме, я могу вам помочь :) - person Lukas Eder; 16.10.2015
comment
Оказывается, я вас неправильно понял. Очевидно, вам нужно 500 различных типов безопасных типов первичных ключей. Вы всегда можете расширить jOOQ JavaGenerator и добавить к нему несколько дополнительных классов. Например, есть раздел пользовательского кода раздел, куда вы можете поместить свой код. Включая, например, ваши пользовательские вложенные классы. Затем вместо использования конфигурации XML используйте программную конфигурацию для создания всех customTypes / forceTypes - person Lukas Eder; 17.10.2015
comment
Спасибо, это то, к чему я стремился. Если вы дадите такой ответ, я могу его одобрить. :) - person blubb; 19.10.2015
comment
@blubb: Готово. Мне очень любопытен этот вариант использования. Будем очень рады узнать об этом больше в группе пользователей. Это определенно была бы очень хорошая новая встроенная функция - person Lukas Eder; 19.10.2015