java - 从纯 Java 生成 jOOQ 类

标签 java code-generation database-schema ddl jooq

有没有办法从纯 Java 代码生成 jOOQ 类?如果没有,最接近的选择是什么?理想情况下,我想在 gradle 构建中执行此操作。

我找到了 this answer ,链接到 this blog post .该帖子的实质是:

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

关于这种方法,有三点困扰我:

  • 该博文在 Maven(和 Ant)中完成了所有工作。我想使用 Gradle,但我可以解决这个问题。
  • 我必须从 JPA 开始。我更喜欢从我的架构的纯 jOOQ 定义开始。 jOOQ 是否有模式定义 DSL/API?
  • 不需要中间步骤(DDL 脚本和 HSQLDB 创建)作为最终产品。相反,它们只需要将 JPA 模型转换为 jOOQ 理解为输入的东西。应该有一种更简洁(仅限 Java)的方式,即使 jOOQ 没有自己的模式定义 API。有吗?

最佳答案

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 path 上的文件.使用您的数据库设置等配置代码段。

这大致就是我们在工作项目中做事的方式。 Jooq 与 Flyway 玩得很好.您可以查看 Jooq 关于 Code generation 的文档.

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

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

编辑:好奇地查看文档和我自己生成的代码后,我发现您可以扩展 RecordTableImpl<Record>类来生成您手动创建的模式类。

可以看到here Record 上重要部分的一个小示例片段和 Table类。

无论如何,考虑到 Jooq(和 Flyway)不希望您避免使用 SQL,而是要接受它。正常的做事方式是

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

关于java - 从纯 Java 生成 jOOQ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31126281/

相关文章:

java - 生成非常大的 Java 代码

Java:在运行时创建类型的新实现?

使用 JavaAssist 创建方法时抛出 java.lang.VerifyError

c# - Entity Framework 的持续交付和数据库模式变化

java - 使用泛型转换数组

java - JDBC PreparedStatement 奇怪的行为

java - 使用 Rest Assured 获取重定向的 url?

database-design - 数据库结构 - 来自多个表的项目

mysql - 如何避免mysql表中的内容重复?

java - SockJS - '/info' 在连接服务器时导致 Http 404