2015-10-16 111 views
2

我想让我们的JOOQ记录更安全。例如,我希望BIGINT字段CUSTOMER.IDORDER.CUSTOMER_ID的类型为CustomerNo而不仅仅是Long如何扩展JOOQ代码生成器?

我可以强制JOOQ的代码生成器生成使用customTypeforcedType组合正确的字段:

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

有一个挂起的功能请求#2574和一些相关的想法,旨在为每个主键/外键元组生成类的代码生成器,这对于表达查询时的某些附加类型检查非常有用。

与此同时,您可以随时扩展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> { 
     ... 
    } 
} 

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

+1

是的,这就是我已经计算出来的部分:)我的问题是关于自动创建“

否”类> 500个表... – blubb

+0

嗯,这是一个正则表达式。你可以匹配任何东西。像'。*?\。CUSTOMER_ID'。如果您提供了关于您的架构的更多信息,我可以提供更多帮助:) –

+0

我误解了您,它似乎出现了。您显然需要500种不同类型的安全主键类型。您可以始终扩展jOOQ的'JavaGenerator'并为其添加一些额外的类。例如,有一个[“自定义代码部分”](http://www.jooq.org/doc/latest/manual/code-generation/codegen-custom-code/)部分,您可以在其中放置自己的代码。例如,包括您的自定义嵌套类。然后,而不是使用XML配置,使用[编程配置](http://www.jooq.org/doc/latest/manual/code-generation/codegen-programmatic/)生成所有customTypes/forcedTypes –