JOOQ генерирует столбцы CHAR OCTETS как CHAR вместо BINARY

Моя проблема очень близка к той, что упомянута в Использование UUID PK или FK в Жар-птица с Джуком

Установка: Jaybird 3.0.5, Firebird 2.5.7, jOOQ 3.11.7, JDK 1.8

Мои поля PK и FK, такие как

ID CHAR(16) CHARACTER SET OCTETS NOT NULL

и

TABLE_ID CHAR(16) CHARACTER SET OCTETS

и я хочу использовать UUID как тип данных java в сгенерированных классах

Я использую соединение JDBC в конфигурации, например

<jdbc>
    <driver>org.firebirdsql.jdbc.FBDriver</driver>
    <url>jdbc:firebirdsql:localhost:c:/DBS/DB.FDB?octetsAsBytes=true</url>
    <properties>
        <property>
            <key>user</key>
            <value>SYSDBA</value>
        </property>
        <property>
            <key>password</key>
            <value>masterkey</value>
        </property>
    </properties>
</jdbc>

Я установил принудительный тип в генераторе, например

<forcedType>
    <userType>java.util.UUID</userType>
    <binding>com.ekser.nakkash.icdv.converters.jooq.ByteArray2UUIDBinding</binding>
    <expression>.*ID$</expression>
    <types>CHAR\(16\)</types>
    <nullability>ALL</nullability>
</forcedType>

а у меня класс

class ByteArray2UUIDBinding implements Binding<byte[], UUID>

Теперь проблема

jOOQ генерирует

public final TableField<MyTableRecord, UUID> ID = createField("ID", org.jooq.impl.SQLDataType.CHAR(16).nullable(false), this, "", new ByteArray2UUIDBinding());

проблема SQLDataType.CHAR(16), должно быть SQLDataType.BINARY(16).

jOOQ переводит мои поля char(16) octets как строку (char(16)), это не учитывает octetsAsBytes=true.

Я попытался поместить его в свойства в <jdbc>, например

<jdbc>
    <driver>org.firebirdsql.jdbc.FBDriver</driver>
    <url>jdbc:firebirdsql:localhost:c:/DBS/DB.FDB</url>
    <properties>
        <property>
            <key>user</key>
            <value>SYSDBA</value>
        </property>
        <property>
            <key>password</key>
            <value>masterkey</value>
        </property>
        <property>
            <key>octetsAsBytes</key>
            <value>true</value>
        </property>
    </properties>
</jdbc>

С тем же результатом.

Что не так? Я рассматриваю возможность запуска поиска и замены для ключевого слова CHAR(16) -> BINARY(16) в сгенерированных классах на данный момент, что не является «стильным».


person Ceyhun Mamedov    schedule 06.12.2018    source источник


Ответы (1)


Параметр octetsAsBytes ничего не делает в Jaybird 3, см. Набор символов OCTETS обрабатывается как JDBC (VAR)BINARY в примечаниях к выпуску Jaybird 3. Jaybird 3 всегда ведет себя как octetsAsBytes=true в предыдущих версиях с некоторыми дополнительными улучшениями.

Другими словами, это вообще не связано с этой настройкой, а является результатом того, как jOOQ генерирует это.

jOOQ осуществляет собственную интроспекцию метаданных, напрямую запрашивая таблицы метаданных Firebird и сопоставляя коды типов Firebird с типами SQL jOOQ (см. FirebirdTableDefinition и FirebirdDatabase.FIELD_TYPE). Он напрямую отображает тип Firebird '15' в CHAR, без дальнейшего рассмотрения подтипов (== наборы символов для этого типа).

Другими словами, вам нужно подать заявку на улучшение в jOOQ, если вы хотите вместо этого сопоставить это с BINARY (хотя мне неясно, почему это действительно проблема для вас).

person Mark Rotteveel    schedule 06.12.2018
comment
спасибо за быстрый ответ. Я знаю, что actetsAsBytes был создан для последних версий Jaybird2, просто вы знаете .... может это сработает ... :) Я полагаю, вы правы насчет логики генерации кода jOOQ. В любом случае, я отмечаю этот ответ как достаточно правильный :) - person Ceyhun Mamedov; 06.12.2018