jOOQ 自定义 Pojo 和 DAO 生成

jOOQ Custom Pojo & DAO Generation

问题

我在代码生成期间配置到自定义 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。这可能吗?文档指出:

If you're using jOOQ's code generator, you can configure it to generate POJOs for you, but you're not required to use those generated POJOs. You can use your own. See the manual's section about POJOs with custom RecordMappers to see how to modify jOOQ's standard POJO mapping behaviour.

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

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

I have implemented RecordMapperProvider but wondering how I register it to be used during the code generation phase, or even if that is possible?

不,不可能,开箱即用。

I love the fact that Pojos & DAOs are generated but I want to define the Pojo myself without too much configuration code

然后,我建议关闭 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. 将新的 classes 添加到 jooq 配置
jooq {
    configurations {
        main {
            generationTool {
                generator {
                    name = 'com.example.my.package.name.Generator'
                    strategy {
                        name = 'com.example.my.package.name.MyGeneratorStrategy'
                    }
                }
            }
        }
    }
}
  1. 现在将使用 POJO 的包前缀而不是生成的包名称生成 daos。