2015-10-16 117 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 –

相關問題