Моя проблема очень близка к той, что упомянута в Использование 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)
в сгенерированных классах на данный момент, что не является «стильным».