【问题标题】:JOOQ is not generating classesJOOQ 没有生成类
【发布时间】:2021-01-22 22:43:21
【问题描述】:

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

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


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 存在时 - 在方法执行期间 domain 包被删除.

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

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

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

我将非常感谢您的每一次帮助 - 提前致谢!

【问题讨论】:

    标签: java mysql spring spring-boot jooq


    【解决方案1】:

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

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

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

    【讨论】:

    • 我已将编辑添加到我正在尝试做的事情的问题中,如您在答案中给出的链接下的教程中所示。你能帮我解决我面临的下一个问题吗?
    • @MarcinSobolewski:感谢您的更新。这是一个新问题,与您原来的问题没有真正的关系。 Stack Overflow 的工作方式是为此创建一个新问题,因为:1) 旧问题本身已经对发现它的未来读者有用,2) 当您编辑问题以继续添加新的、不相关的内容时,未来读者(包括我)会发现很难理解问题的顺序是什么。我会留意你的新问题。我建议恢复对此的编辑。
    • 我已恢复当前帖子并删除了编辑部分。然后我发布了你上面提到的一个新主题,这是链接:link
    • @MarcinSobolewski 非常感谢 :) 我会马上调查的。
    猜你喜欢
    • 2019-10-10
    • 2021-12-29
    • 2021-01-27
    • 1970-01-01
    • 2015-09-16
    • 2019-06-11
    • 2020-09-03
    • 2018-12-27
    • 2019-04-01
    相关资源
    最近更新 更多