3

ビルド プロセス中に を使用してorg.jooq.util.DefaultGenerator、データベース スキーマを表す jOOQ クラスを生成します。

アプリケーションが実行されている間、スキーマはアプリケーションに認識されずに変更されることが予想されます。このような変更は、既に生成されたコードと互換性がある場合と互換性がない場合があります。

生成されたコードが特定のスキーマに対してまだ有効かどうかを実行時に検出するにはどうすればよいですか?

私は次のようなものを探していますboolean stillValid = new SchemaValidator(existingGeneratedCodePath, jdbcUrl, jdbcProps).validate();

4

1 に答える 1

3

org.jooq.Meta を使用した jOOQ 3.0 ソリューション

今後の jOOQ 3.0 では、JDBCは新しいオブジェクト (機能要求#1968DatabaseMetaDataで実装) を介して「jOOQ 方式」でアクセスできます。このオブジェクトは、次のタイプのさまざまなオブジェクトへのアクセスを提供します。org.jooq.Meta

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

このトリックにより、増分が互換性があるかどうかを検出できます

于 2012-12-31T14:13:34.643 に答える