架构更新后jOOQ生成的类的运行时验证?

时间:2012-12-31 11:20:45

标签: java sql validation code-generation jooq

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

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

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

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

这样的东西

1 个答案:

答案 0 :(得分:3)

使用org.jooq.Meta

的jOOQ 3.0解决方案

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

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

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