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
来实现。
我迟到了几年,但实际上我找到了一种非常简单的方法来做到这一点。我承认它有点脆弱,但您可以进一步完善它以满足您的需要。
- 在您的 gradle 项目中创建一个新模块,例如名为
jooq-generator
- 将 jooq-codegen 添加为模块的 compileOnly 依赖项
- 在模块中创建一个新的class:
public class Generator extends JavaGenerator {
@Override
public boolean generatePojos() {
return false;
}
}
- 在模块中创建一个新的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";
}
}
- 将模块作为依赖项添加到 jooqGenerator
jooqGenerator project(":jooq-generator")
- 将新的 classes 添加到 jooq 配置
jooq {
configurations {
main {
generationTool {
generator {
name = 'com.example.my.package.name.Generator'
strategy {
name = 'com.example.my.package.name.MyGeneratorStrategy'
}
}
}
}
}
}
- 现在将使用 POJO 的包前缀而不是生成的包名称生成 daos。
问题
我在代码生成期间配置到自定义 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
来实现。
我迟到了几年,但实际上我找到了一种非常简单的方法来做到这一点。我承认它有点脆弱,但您可以进一步完善它以满足您的需要。
- 在您的 gradle 项目中创建一个新模块,例如名为
jooq-generator
- 将 jooq-codegen 添加为模块的 compileOnly 依赖项
- 在模块中创建一个新的class:
public class Generator extends JavaGenerator {
@Override
public boolean generatePojos() {
return false;
}
}
- 在模块中创建一个新的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";
}
}
- 将模块作为依赖项添加到 jooqGenerator
jooqGenerator project(":jooq-generator")
- 将新的 classes 添加到 jooq 配置
jooq {
configurations {
main {
generationTool {
generator {
name = 'com.example.my.package.name.Generator'
strategy {
name = 'com.example.my.package.name.MyGeneratorStrategy'
}
}
}
}
}
}
- 现在将使用 POJO 的包前缀而不是生成的包名称生成 daos。