将自定义`Binding`添加到postgres-enum-typed`TableField`时,Field的“DataType”发生意外更改

时间:2017-12-11 08:55:58

标签: java sql postgresql jooq

我们在Postgres 9.5中使用JOOQ 3.7.3。我们利用Postgres' enum类型并将它们映射到我们自己的(手写)Java枚举。到目前为止,JOOQ元模型看起来像这样:

TableField<InvoiceAccountingEntryRecord, AccountingTypeEnum> ACCOUNTING_TYPE = 
     createField("accounting_type",
                 org.jooq.util.postgres.PostgresDataType.VARCHAR.asEnumDataType(com.us.app.schema.enums.AccountingTypeEnum.class),                                                                                                       
                 this,  
                 "");

使用JOOQ生成的枚举使Schema生成变得容易,但我们需要大量的显式映射。我们想直接在JOOQ模型中使用我们自己的枚举类型,并在JOOQ生成器配置中为每个类型定义一个自定义绑定:

<customType>
  <name>AccountingTypeEnum</name>
  <type>com.us.own.enums.AccountingType</type>
  <binding>com.us.own.enums.AccountingType.AccountingTypeJooqBinding</binding>
</customType>
...
<forcedType>
  <name>AccountingTypeEnum</name>
  <expression>.*ACCOUNTING_TYPE</expression>
</forcedType>

奇怪的是,这不仅影响了字段的值类型,还影响了DataType,后者更改为DefaultDataType.getDefaultDataType("USER-DEFINED")DataType<Object>

TableField<InvoiceAccountingEntryRecord, AccountingType> ACCOUNTING_TYPE = 
     createField("accounting_type",
                 org.jooq.impl.DefaultDataType.getDefaultDataType("USER-DEFINED"),
                 this,
                 "",
                 new AccountingTypeJooqBinding());

为什么会这样,我可以确定我之前使用过的DataType<AccountingTypeEnum>吗?

1 个答案:

答案 0 :(得分:1)

经过一些实验,结果证明这确实是JOOQ发生器中的一个错误,它影响3.7.3但在3.10.3中不再存在。是时候升级了!