【问题标题】:jOOQ Custom Pojo & DAO GenerationjOOQ 自定义 Pojo 和 DAO 生成
【发布时间】:2018-09-04 22:13:45
【问题描述】:

问题

在代码生成过程中,我在配置到自定义 Pojo 的映射时遇到了一些问题。

问题

我已经实现了RecordMapperProvider,但我想知道如何注册它以在代码生成阶段使用,或者即使可以这样做?

更多上下文

我喜欢生成 Pojo 和 DAO 的事实,但我想自己定义 Pojo,而不需要太多配置代码。我正在使用ModelMapper 从类型映射到目标:

@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 对象(它是一个 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 生成 Pojos(基于 ModelMapper 在我的 RecordMapperProvider 实现中提供的映射)并且还让 jOOQ 为这些 Pojos 提供 DAO。这可能吗?文档指出:

如果您使用 jOOQ 的代码生成器,您可以将其配置为为您生成 POJO,但您不需要使用这些生成的 POJO。你可以使用你自己的。请参阅手册中关于带有自定义 RecordMappers 的 POJO 的部分,以了解如何修改 jOOQ 的标准 POJO 映射行为。

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

这对我来说表明了这种可能性,但只会让我实现RecordMapperProvider,之后什么都没有。

【问题讨论】:

    标签: sql pojo jooq modelmapper


    【解决方案1】:

    我已经实现了 RecordMapperProvider,但想知道如何注册它以在代码生成阶段使用,或者即使可以这样?

    不,这是不可能的,开箱即用。

    我喜欢 Pojos 和 DAO 生成的事实,但我想自己定义 Pojo 而无需太多配置代码

    然后,我建议关闭 POJO 和 DAO 的生成并自己滚动。要么创建 DAO 的手动实现,要么扩展 JavaGenerator 以执行此操作。

    【讨论】:

      【解决方案2】:

      我迟到了几年,但实际上我找到了一个非常简单的方法来做到这一点。我承认它有点脆弱,但您可以进一步完善它以满足您的需求。

      1. 在您的 gradle 项目中创建一个新模块,例如名为 jooq-generator
      2. 将 jooq-codegen 作为 compileOnly 依赖添加到模块
      3. 在模块中新建一个类:
      public class Generator extends JavaGenerator {
          @Override
          public boolean generatePojos() {
              return false;
          }
      }
      
      1. 在模块中新建一个类:
      
      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 的包前缀而不是生成的包名称来生成 daos。

      【讨论】:

        猜你喜欢
        • 2014-11-28
        • 1970-01-01
        • 2015-02-06
        • 1970-01-01
        • 2016-05-05
        • 2013-11-22
        • 2019-02-09
        • 2017-06-29
        • 2016-05-26
        相关资源
        最近更新 更多