当前位置: 首页 > 知识库问答 >
问题:

JOOQ没有生成类

汪弘毅
2023-03-14

我对JOOQ框架(3.13.4)以及Spring Boot和Java8有问题。

问题是我试图使用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());
        }
    }
}

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

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

有趣的是,当我运行这段代码时,包com.ormtester.jooq.domain出现了——在方法执行期间,域包被删除了。

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

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

那么,有没有人面临同样的问题,或者只是告诉我,我是否做错了什么,或者我在这里提供的代码片段中缺少了什么?我已经有这个问题大约4天了,现在我已经不知道什么是错的了。我在许多论坛上浏览了大量的主题,但没有什么帮助我,包括作者页面上的教程(在我看来,这些教程只是缺乏重要信息)。

我会非常感谢每一个帮助 - 提前感谢!

共有1个答案

梁池暝
2023-03-14

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

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

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

 类似资料:
  • 我更改了数据库中的一些表,所以我想生成记录、键、类等。但是每次我这样做时,它总是跳过jooq代码生成。 [INFO]--jooq-codegen-maven:3.11.10:generate(默认cli)@http网关--[INFO]跳过jooq代码生成 为了运行Jooq代码生成,我应该执行哪个mvn cmd?现在我使用: 谢谢

  • Jooq不生成类。我使用gradle插件https://github.com/etiennestuder/gradle-jooq-plugin使用postgresql 42.2.24。我的问题是什么?这是我的身材 输出任务:生成Jooq 在2s中成功构建1个可操作任务:1个已执行

  • 问题内容: 我正在尝试将jOOQ包含在我的代码中,但是未生成任何代码。 执行时,不会生成任何源。我希望它创建一个在以下-file文件中定义的类。 我的pom.xml文件如下所示: 我假设应该使用适当的类来创建目录。Maven构建成功运行,没有任何错误。 您可以在此GitHub存储库中找到整个项目。 问题答案: 您正在使用内存数据库:。jOOQ代码生成器启动时,它将接收到一个空的 新 数据库,而不是

  • 有没有从纯Java代码生成jOOQ类的方法?如果不是,最接近的替代方案是什么?理想情况下,我希望在渐变版本中进行此操作。 我找到了这个答案,它链接到了这篇博文。这篇文章的实质是: 从JPA车型开始 将其转换为DDL脚本(.sql文件,其中包含语句) 创建一个新的HSQLDB文件,并通过在其上运行DDL脚本用表填充它。将生成的数据库保存到磁盘 从磁盘加载该数据库并在其上运行jOOQ代码生成 使用生成

  • 我使用jOOQ程序代码生成数据库,但现在我遇到了一些问题。在数据库中,我有表A和表B。第一次都生成了pojo、dao、接口等。经过一段时间的开发,我发现表A需要添加一些字段或修改一些字段,所以我不得不再次编码,然后jOOQ代码生成器将覆盖现有的代码,这让我很难过。当我在排除表的情况下使用“排除A”时,发现只生成了表A的数据,表B将被删除。我不知道如何处理这个问题。我的代码生成器如下:

  • 是否有任何参数可以在jooq代码生成期间打开/关闭下一个查询的执行? 在有大量模式和对象的数据库上,执行大约需要一个小时