有没有从纯Java代码生成jOOQ类的方法?如果不是,最接近的替代方案是什么?理想情况下,我希望在渐变版本中进行此操作。
我找到了这个答案,它链接到了这篇博文。这篇文章的实质是:
CREATE
语句)这种方法有三个问题困扰着我:
基于@ggalmazor的回答,我最终使用了大部分Java代码,只有最少的SQL脚本核心。现在我的代码生成过程包括3个简单的步骤:
CREATE TABLE
语句)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 {
}
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
您可以在这里看到
Record
和Table
类中重要部分的一个小示例片段。
无论如何,考虑到Jooq(和Flyway)不想让你避开SQL而是拥抱它。正常的做事方式是
使用SQL脚本创建数据库对象
- 使用Jooq生成器生成模式类
- 您可以在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类: 如果我想添加主键和可能的外键、索引等,它会变得更加复杂。 在调用时没有添加这些内容,这是预期的行为吗? 注意:我手动创建,因为我没有源