簡體   English   中英

jOOQ 自定義 Pojo 和 DAO 生成

[英]jOOQ Custom Pojo & DAO Generation

問題

我在代碼生成期間配置映射到自定義 Pojos 時遇到一些問題。

問題

我已經實現RecordMapperProvider但想知道如何注冊它以便在代碼生成階段使用它,或者即使這可能嗎?

更多上下文

我喜歡生成 Pojos 和 DAO 的事實,但我想自己定義 Pojo 而無需太多配置代碼。 我正在使用ModelMapper從類型到目標 map:

@Override
public <R extends Record, E> RecordMapper<R, E> provide(RecordType<R> recordType,
                                                        Class<? extends E> type) {

    if (mapping.containsKey(type)) {
        return record -> modelMapper.map(mapping.get(type), type);
    }

    return new DefaultRecordMapper<>(recordType, type);
}

如果有幫助,我正在使用 DefaultConfiguration object(這是一個 bean)配置 jOOQ:

@Bean
public DefaultConfiguration configuration() {
    DefaultConfiguration jooqConfiguration = new DefaultConfiguration();
    jooqConfiguration.setConnectionProvider(dataSourceConnectionProvider());
    jooqConfiguration.setExecuteListenerProvider(new DefaultExecuteListenerProvider(
            jooqToSpringExceptionTranslator()));
    jooqConfiguration.setSQLDialect(
            SQLDialect.valueOf(env.getRequiredProperty("jooq.sql.dialect")));
    jooqConfiguration.setRecordMapperProvider(new JooqRecordMapperFactory(modelMapper()));

    return jooqConfiguration;
}

然后對於代碼生成,我在 gradle 中配置它:

jooq {
version = '3.10.5'
edition = 'OSS'

myDb(sourceSets.getByName("main")) {
    jdbc {
        driver = dbDriver
        url = dbUrl
        user = dbUsername
    }
    generator {
        name = 'org.jooq.util.JavaGenerator'
        strategy {
            name = 'org.jooq.util.DefaultGeneratorStrategy'
        }
        database {
            name = 'org.jooq.util.postgres.PostgresDatabase'
            inputSchema = dbSchema
        }
        generate {
            relations = true
            deprecated = false
            records = true
            immutablePojos = true
            fluentSetters = true
            daos = true
        }
        target {
            packageName = 'com.textiq.quinn.common.dao.model.generated'
        }
    }
}
}

我確信這兩種配置之間存在脫節,但我無法從文檔中了解我是如何同步這些配置的。 理想情況下,我希望 jOOQ 生成 Pojo(基於ModelMapper在我的RecordMapperProvider實現中提供的映射),並讓 jOOQ 為這些 Pojo 提供 DAO。 這可能嗎? 文件指出:

如果您正在使用 jOOQ 的代碼生成器,您可以將其配置為為您生成 POJO,但您不需要使用那些生成的 POJO。 你可以使用你自己的。 請參閱手冊中關於帶有自定義 RecordMappers 的 POJO 的部分,以了解如何修改 jOOQ 的標准 POJO 映射行為。

來源: https://www.jooq.org/doc/3.9/manual/sql-execution/fetching/pojos/

對我來說,這表明了這種可能性,但只會讓我實現RecordMapperProvider ,此后什么也沒有。

我已經實現了RecordMapperProvider,但想知道如何注冊它以在代碼生成階段使用,或者即使可以實現?

不,不可能,開箱即用。

我喜歡生成Pojos和DAO的事實,但是我想自己定義Pojo,而無需過多的配置代碼

然后,我建議關閉POJO和DAO的生成,並自己滾動。 創建DAO的手動實現,或擴展JavaGenerator來實現。

我遲到了幾年,但我實際上找到了一種非常簡單的方法來做到這一點。 我承認它有點脆弱,但您可以進一步完善它以滿足您的需要。

  1. 在您的 gradle 項目中創建一個新模塊,例如名為jooq-generator
  2. 將 jooq-codegen 作為 compileOnly 依賴項添加到模塊
  3. 在模塊中新建class:
public class Generator extends JavaGenerator {
    @Override
    public boolean generatePojos() {
        return false;
    }
}
  1. 在模塊中新建class:

public class MyGeneratorStrategy extends DefaultGeneratorStrategy {
   @Override
   public String getJavaPackageName(Definition definition, Mode mode) {
       if (mode != Mode.POJO) {
           return super.getJavaPackageName(definition, mode);
       }
       return "com.example.my.model.package.prefix";
   }

}
  1. 將模塊作為依賴項添加到 jooqGenerator jooqGenerator project(":jooq-generator")
  2. 將新類添加到 jooq 配置
jooq {
    configurations {
        main {
            generationTool {
                generator {
                    name = 'com.example.my.package.name.Generator'
                    strategy {
                        name = 'com.example.my.package.name.MyGeneratorStrategy'
                    }
                }
            }
        }
    }
}
  1. 現在將使用 POJO 的 package 前綴而不是生成的 package 名稱生成 daos。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM