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

从纯Java生成jOOQ类

充煌
2023-03-14

有没有从纯Java代码生成jOOQ类的方法?如果不是,最接近的替代方案是什么?理想情况下,我希望在渐变版本中进行此操作。

我找到了这个答案,它链接到了这篇博文。这篇文章的实质是:

  1. 从JPA车型开始
  2. 将其转换为DDL脚本(.sql文件,其中包含CREATE语句)
  3. 创建一个新的HSQLDB文件,并通过在其上运行DDL脚本用表填充它。将生成的数据库保存到磁盘
  4. 从磁盘加载该数据库并在其上运行jOOQ代码生成
  5. 使用生成的jOOQ类

这种方法有三个问题困扰着我:

  • 那篇博客文章在Maven什么都做(

共有2个答案

陶鸿畴
2023-03-14

基于@ggalmazor的回答,我最终使用了大部分Java代码,只有最少的SQL脚本核心。现在我的代码生成过程包括3个简单的步骤:

  1. 编写SQL DDL脚本(即CREATE TABLE语句)
  2. 运行Flyway,创建内存中的H2数据库
  3. 在同一个数据库上运行jOOQ以生成Java代码

Flyway和jOOQ都是用Java代码完全配置的;不需要xml配置文件。

这是我的代码:

public class Main {

    public static void main(String... args) {
        JdbcDataSource ds = new JdbcDataSource();
        ds.setURL("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1");
        ds.setUser("u");
        ds.setPassword("p");

        // Flyway
        Flyway flyway = new Flyway();
        flyway.setDataSource(ds);
        flyway.setLocations("classpath:com.example.datadefinition.flyway.migrations");
        flyway.migrate();

        // jOOQ
        try (Connection c = ds.getConnection()) {
            Configuration configuration = new Configuration()
                .withGenerator(new Generator()
                    .withName(MyOwnGenerator.class.getCanonicalName())
                    .withDatabase(new Database()
                        .withName(H2Database.class.getCanonicalName())
                        .withIncludes(".*")
                        .withExcludes("")
                        .withInputSchema("PUBLIC")
                    )
                    .withTarget(new Target()
                        .withPackageName("com.example.lib.data")
                        // jOOQ will create package folders for com.example.lib.data
                        .withDirectory("../sibling-project/src/main")
                    )
                );

            GenerationTool tool = new GenerationTool();
            tool.setConnection(c);
            tool.run(configuration);
        } catch (SQLException e) {
            // sql connection problems
            e.printStackTrace();
        } catch (Exception e) {
            // run failed
            e.printStackTrace();
        }
    }
}

public class MyOwnGenerator extends JavaGenerator {

    public SwsGenerator() {
        setStrategy(new MyOwnGeneratorStrategy());
    }

}

public class MyOwnGeneratorStrategy extends DefaultGeneratorStrategy {

}
邢骏
2023-03-14

Jooq需要先创建一些表。你可以使用Flyway(你也应该使用它的迁移)。

一旦你有了所有的表,你可以使用这个片段让Jooq为你的表生成源文件:

import org.jooq.util.GenerationTool;
import org.jooq.util.jaxb.*;

Configuration configuration = new Configuration()
    .withJdbc(new Jdbc()
        .withDriver("org.postgresql.Driver")
        .withUrl("jdbc:postgresql://localhost/your_database")
        .withUser("username")
        .withPassword("password"))
    .withGenerator(new Generator()
        .withName("org.jooq.util.DefaultGenerator")
        .withDatabase(new Database()
                .withName("org.jooq.util.postgres.PostgresDatabase")
                .withIncludes(".*")
                .withSchemata(new Schema().withInputSchema("your_schema"))
        )
        .withTarget(new Target()
            .withPackageName("jooq.generate")
            .withDirectory("src/main/java")));
try {
  GenerationTool.generate(configuration);
} catch (Exception e) {
  e.printStackTrace();
}

这将留下一些。java文件位于src/main/java路径上。使用数据库设置等配置代码段。

这大致就是我们在工作项目中的做事方式。Jooq与Flyway的配合非常出色。您可以查看Jooq关于代码生成的文档。

有一个我们不使用的maven插件,因为我们有一个多租户设置,需要对数据库迁移和代码生成进行一些运行时配置。

我想,一旦在某个类的静态main方法中准备好了Jooq生成,就可以从gradle任务中运行它。我只能在这里向您指出Jooq关于从gradle运行它的文档

编辑:在好奇地查看了留档和我自己生成的代码后,我看到您可以扩展记录TableImpl

您可以在这里看到RecordTable类中重要部分的一个小示例片段。

无论如何,考虑到Jooq(和Flyway)不想让你避开SQL而是拥抱它。正常的做事方式是

  1. 使用SQL脚本创建数据库对象
  2. 使用Jooq生成器生成模式类
  3. 您可以在Jooq的DSL上下文中使用它们。

 类似资料:
  • 我更改了数据库中的一些表,所以我想生成记录、键、类等。但是每次我这样做时,它总是跳过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框架(3.13.4)以及Spring Boot和Java8有问题。 问题是我试图使用java代码方式生成域类(而不是使用带有maven的codegen插件,这在自定义命名策略提供程序方面遇到了一些麻烦)。因此,首先让我向您展示包含(至少我相信它包含)所有必要bean的@Configuration类: 可路由数据源是一种扩展抽象路由数据源的类型,因为在这种情况下,我需要有可能在运行时更改

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

  • 问题内容: 我目前正在尝试从jpa实体生成jooq类,而不是使用现有的数据库。 跟随此页面并使用jooq版本3.9.1,我当前的pom插件部分如下所示 当运行maven软件包时,这确实会成功,但是不会生成预期的jooq类。构建的堆栈跟踪显示: 问题答案: 您的实体可能与放置插件的位置位于同一模块中。这意味着jOOQ代码生成器在编译模块之前被调用,这意味着当jOOQ代码生成器尝试查找带有JPA注释的

  • 我尝试使用jOOQ作为模式生成器来生成DDL语句,然后再生成SQL insert语句。 底层数据来自静态CSV文件,我基本上希望编写一个静态SQL脚本,其中包括创建模式和插入数据的语句;只是一个转储文件。 例如,我有一个包含表definition的Groovy类: 如果我想添加主键和可能的外键、索引等,它会变得更加复杂。 在调用时没有添加这些内容,这是预期的行为吗? 注意:我手动创建,因为我没有源