繁体   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