当前位置: 首页 > 面试题库 >

模式更新后jOOQ生成的类的运行时验证?

黄逸清
2023-03-14
问题内容

org.jooq.util.DefaultGenerator在构建过程中使用来生成jOOQ类来表示我的数据库模式。

当应用程序运行时,架构可能会在应用程序不知道的情况下发生更改。这样的更改可能与已经生成的代码兼容,也可能与之不兼容。

如何在运行时中检测生成的代码是否仍然在特定模式下有效?

我正在寻找类似的东西 boolean stillValid = new SchemaValidator(existingGeneratedCodePath, jdbcUrl, jdbcProps).validate();


问题答案:

使用org.jooq.Meta的jOOQ 3.0解决方案

在即将到来的jOOQ
3.0中,DatabaseMetaData可以通过新org.jooq.Meta对象(通过功能请求#1968实现)以“
jOOQ方式”访问JDBC 。该对象提供对这些类型的各种对象的访问:

  • org.jooq.Catalog
  • org.jooq.Schema
  • org.jooq.Table
  • org.jooq.Field
  • org.jooq.DataType

这些可以与您生成的类进行比较,例如

MY_SCHEMA.getTables().equals(create.meta().getTables())

使用JDBC DatabaseMetaData的jOOQ 2.x解决方案

上面的解决方案可以手动实现,只需查询即可Connection.getMetaData()。当然,还要多做一些工作

查询所有表的技巧

另一个简单的解决方案是查询所有生成的表,如下所示:

List<Table<?>> invalidTables = new ArrayList<>();

for (Table<?> table : MY_SCHEMA.getTables()) {
    try {
        create.selectFrom(table).where(Factory.falseCondition()).fetch();
    }

    // If table names / column names change, the above query would fail
    catch (DataAccessException e) {
        invalidTables.add(table);
    }
}

这个技巧将允许检测增量是否兼容



 类似资料:
  • 我在构建过程中使用org.jooq.util.DefaultGenerator来生成jOOQ类来表示我的数据库模式。 当应用程序运行时,模式可能会在应用程序不知道的情况下更改。此类更改可能与已生成的代码兼容,也可能与已生成的代码不兼容。 如何在运行时检测生成的代码是否对特定模式仍然有效? 我正在寻找类似于布尔值stillValid=new SchemaValidator(存在的GeneratedC

  • 我需要在应用程序启动时检查当前在数据库中的数据库模式和以前用于JOOQ生成模型的模式是相同的。我试图使用这里建议的解决方案,发现了一些问题: 查询所有表的技巧:这种解决方案不检查列类型,只检查表名和字段名,但我也需要检查类型 :此处仅检查架构和名称,不再检查列类型 我试图使用中可用的信息并手动进行比较,但遇到了另一个问题。在某些情况下,生成字段的数据类型和运行时从检索的字段不匹配。 例如,无时区默

  • 我找了很长时间,所以在标记为重复之前,请务必阅读。 我有一个函数(),它是用一个参数调用的。我想将该id作为前缀添加到每个日志消息中。每次调用函数时,它都会更改。因此,我想更新记录器模式,将此id添加为前缀。 我读过: 如何配置 如何重新配置 SO和log4j论坛上的许多帖子都在讨论如何在运行时更改配置。它们要么过时,要么根本不起作用。 以下代码基于 log4j2 文档。它打印: 如果我注释掉行然

  • 我希望 jOOQ 基于我提供的库架构 xml 文件(而不是基于 db 连接)自动生成代码。如果我更改了 liquibase xml 文件中的某些内容,则更改将反映在数据库中,但我无法生成自动生成的新代码。我必须运行两次mvn干净编译,以便jOOQ了解更改。 我pom.xml的发电机部分是这样的。请帮助:

  • 但得到以下错误: 如何使其工作? 谢谢您的帮助。 顺便说一句:我正在使用JRE1.8.0_65

  • Dave使用Flyway为Alice和Bob初始化模式,因此他们都有foo table和bar函数。Dave使用jOOQ生成java api,并在运行时将开发模式映射到用户模式。戴夫以前和他的任何一个客户都没有关系,突然发现自己是鲍勃的侄子。 但是爱丽丝和鲍勃后来都回来找戴夫,让他为他们写一些自动化。因此,Dave决定创建一个机器用户Rob,他可以访问Alice和Bob的模式。他可以重用所有相同的