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

标签 java sql validation code-generation jooq

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

当应用程序运行时,模式会在应用程序不知情的情况下发生变化。此类更改可能与已生成的代码兼容,也可能不兼容。

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

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

最佳答案

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

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

  • 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);
    }
}

这个技巧可以检测增量是否兼容

关于java - 模式更新后 jOOQ 生成类的运行时验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14100907/

相关文章:

java - jUnit 测试精神

sql - 解决 VB6 中的 ADO 超时问题

c# - 微软同步框架 : Cannot enumerate changes at the RelationalSyncProvider for table 'Table Name'

cocoa - 验证 TextField 中的文本

java - 标签 'select' ,字段 'list' ,名称 'uuid' : The requested list key 'deptList' could not be resolved as a collection/array/map/enumeration/iterator type

java - 在 Java 中读取字典文件时内存过多

java - 什么是 NullPointerException,我该如何解决?

java - Logstash 输入插件 JDBC 的 Mongodb 驱动程序类

php - 用 sql 或 php 解决这个问题 - 性能

java - 如何在类级别注释之前对用@valid注释的属性执行验证?