首页 > 解决方案 > JOOQ 没有生成类

问题描述

我对 JOOQ 框架(3.13.4)以及 Spring Boot 和 Java 8 有疑问。

问题是我正在尝试使用 java 代码方式生成域类(而不是使用带有自定义命名策略提供程序的一些麻烦的 maven 的 codegen 插件)。因此,首先让我向您展示包含(至少我相信它包含)所有必要 bean的@Configuration类:


import com.ormtester.common.base.Measurer;
import com.ormtester.common.utils.enums.OrmType;
import com.ormtester.datasources.config.RouteableDataSource;
import org.jooq.SQLDialect;
import org.jooq.codegen.GenerationTool;
import org.jooq.impl.DataSourceConnectionProvider;
import org.jooq.impl.DefaultConfiguration;
import org.jooq.impl.DefaultDSLContext;
import org.jooq.impl.DefaultExecuteListenerProvider;
import org.jooq.util.xml.jaxb.Schema;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.jooq.meta.jaxb.*;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.annotation.PostConstruct;
import java.util.Properties;

@Configuration
@EnableTransactionManagement
public class JooqConfigurator {

    private Properties moduleProperties;

    private RouteableDataSource routeableDataSource;

    public JooqConfigurator(RouteableDataSource routeableDataSource) {
        this.routeableDataSource = routeableDataSource;
        try {
            moduleProperties = new Properties();
            moduleProperties.load(JooqConfigurator.class.getClassLoader()
                    .getResourceAsStream("jooq.properties"));
        } catch (Exception ignore) {}
    }

    @Bean
    public DataSourceConnectionProvider connectionProvider() {
        return new DataSourceConnectionProvider(routeableDataSource);
    }

    @Bean
    public ExceptionTranslator exceptionTransformer() {
        return new ExceptionTranslator();
    }

    @Bean
    public DefaultConfiguration configuration() {
        DefaultConfiguration jooqConfiguration = new DefaultConfiguration();
        jooqConfiguration.set(connectionProvider());
        jooqConfiguration.set(new DefaultExecuteListenerProvider(exceptionTransformer()));
        jooqConfiguration.set(SQLDialect.DEFAULT);
        return jooqConfiguration;
    }

    @Bean
    public DefaultDSLContext dsl() {
        return new DefaultDSLContext(configuration());
    }

    @PostConstruct
    public void generateCode() {
        try {
            GenerationTool.generate(new org.jooq.meta.jaxb.Configuration()
                    .withJdbc(new Jdbc()
                            .withDriver("com.mysql.cj.jdbc.Driver")
                            .withUrl("jdbc:mysql://localhost:3306/ormtester?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC")
                            .withUser("root")
                            .withPassword("root123"))
                    .withGenerator(new Generator()
                            .withName("org.jooq.codegen.JavaGenerator")
                            .withStrategy(new CustomStrategyProvider())
                            .withDatabase(new Database()
                                    .withName("org.jooq.meta.mysql.MySQLDatabase")
                                    .withIncludes(".*")
                                    .withExcludes("")
                                    .withSchemata(new SchemaMappingType().withInputSchema("ormtester").withOutputSchema("ormtester"))
                                    .withInputCatalog("ormtester")
                                    .withOutputCatalog("ormtester"))
                            .withTarget(new Target()
                                    .withPackageName("com.ormtester.jooq.domain")
                                    .withDirectory("jooq/src/main/java"))));
        } catch (Exception e) {
            System.out.println(e.getLocalizedMessage());
        }
    }
}

RouteableDataSource 是一种扩展AbstractRoutingDataSource的类型,因为在这种情况下,我需要有可能在运行时更改数据源。这个东西在项目的其他区域运行良好(或者换句话说,使用 Hibernate 或 MyBatis 等工具)。

如您所见,有一个用于生成域类的@PostConstruct方法,问题是该方法不会生成任何错误或其他东西,但也不会生成类。我尝试使用 PostgreSQL 和 Oracle 数据库运行它(当然要更改驱动程序、数据库名称等),情况看起来完全一样。

一件有趣的事情是,当我运行此代码并且包com.ormtester.jooq.domain存在时 - 在方法执行期间,包被删除。

我还想提一下,通过位于项目主(启动器)类中的@SpringBootApplication注释排除JooqAutoConfiguration类来禁用 JOOQ 自动配置。

IDE 正在管理员模式下运行 - 还有一点很有趣 - 如果我将在我提供的自定义命名策略中的getJavaClassName()方法中设置断点(CustomStrategyProvider扩展DefaultGeneratorStrategy类,则每次使用此方法时都会到达断点。

那么是否有人面临同样的问题和/或只是可以告诉我我做错了什么或我在这里提供的代码片段中缺少什么?我从大约 4 天开始就遇到了这个问题,现在我已经没有什么想法可能出问题了。我浏览了许多论坛上的大量主题,但没有任何帮助,包括作者页面上的教程(在我看来,这只是缺乏重要信息)。

我将非常感谢您的每一次帮助-在此先感谢!

标签: javamysqlspringspring-bootjooq

解决方案


代码生成是构建任务,而不是运行时任务。我想不出只在运行时生成代码才有意义的合理场景。

问题是我正在尝试使用java代码方式生成域类(而不是使用带有自定义命名策略提供程序的maven的codegen插件)

您必须创建一个单独的 maven 模块(或项目),在其中构建自定义命名策略,然后将其作为依赖项添加到 jOOQ 代码生成插件。这与 的工作方式相同JPADatabase,实体必须放置在单独的 maven 模块中。


推荐阅读