有没有办法从纯 Java 代码生成 jOOQ 类?如果没有,最接近的选择是什么?理想情况下,我想在 gradle 构建中执行此操作。
我找到了 this answer ,链接到 this blog post .该帖子的实质是:
- 从 JPA 模型开始
- 将其转换为 DDL 脚本(充满
CREATE
语句的 .sql 文件) - 创建一个新的 HSQLDB 文件,并通过在其上运行 DDL 脚本来用表填充它。将生成的数据库保存到磁盘。
- 从磁盘加载该数据库并在其上运行 jOOQ 代码生成
- 使用生成的 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
编辑:好奇地查看文档和我自己生成的代码后,我发现您可以扩展 Record
和 TableImpl<Record>
类来生成您手动创建的模式类。
可以看到here Record
上重要部分的一个小示例片段和 Table
类。
无论如何,考虑到 Jooq(和 Flyway)不希望您避免使用 SQL,而是要接受它。正常的做事方式是
- 使用 SQL 脚本创建数据库对象
- 您使用 Jooq 生成器生成您的模式类
- 您将它们与 Jooq 的 DSL 上下文一起使用。
关于java - 从纯 Java 生成 jOOQ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31126281/