如何扩展JOOQ代码生成器?

时间:2015-10-16 15:49:00

标签: java sql code-generation jooq

我想让我们的JOOQ记录更加类型安全。例如,我希望BIGINT字段CUSTOMER.IDORDER.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类型的每个单字段主键,我需要创建两个类,即CustomerNoCustomerNoConverter的等价物。当然,最方便的方法是使用JOOQ元模型遍历任何此类字段并为每个字段生成代码。

由于JOOQ模型本身依赖于要生成的类,我需要挂钩到JOOQ的代码生成器。但是,我无法为此任务找到合适的回调机制。我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:1)

有一个待处理的功能请求#2574和一些相关的想法,它们针对代码生成器为每个主键/外键元组生成类,这对于表达查询时的某些其他类型检查非常有用。 / p>

与此同时,您可以随时扩展jOOQ的JavaGenerator并为其添加一些额外的类。例如,有一个"custom code section"部分,您可以在其中放置自己的代码。例如,包括您的自定义嵌套类。输出可能是这样的:

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> {
        ...
    }
}

然后,使用programmatic configuration生成所有customTypes / forcedTypes,而不是使用XML配置。