在数据库 DDL 中查找未映射的字段
Find unmapped fields in database DDL
我们由 Hibernate 映射的模式随着时间的推移而发展,我们正在使用 flyway 在不同版本之间迁移;它很好用。然后,我们在 CI-build 管道期间自动对数据库副本进行迁移,并启动休眠以验证我们的模型是否与我们的模式兼容,从而确保迁移在部署时能够正常工作。
然而,如果我们忘记删除数据库中的某个字段,但在模型中将其删除,则会出现一个问题。如果该字段是 NOT NULL 字段或外键,问题会变得更糟。
因此,我想在启动期间建立一个检查,以验证数据库不包含休眠 未知的任何字段。 Hibernates SchemaValidator 检查数据库中是否缺少任何字段,但不关心反之亦然。
关于如何编写此逻辑的任何想法。我在想我可能 SchemaValidator 来获取 DDL,但似乎有很多陷阱需要处理。
1) 从 Hibernate (hbm2dd) 生成新模式到单独的数据库 schema/user/owner。我们将其命名为 HIBERNATE_SCHEMA
.
2) 查询数据库 dictionary/metadata 以了解原始模式(我们将其命名为 ORIGINAL_SCHEMA
)和休眠模式之间的差异。例如,在 Oracle 中:
select table_name, column_name from ALL_TAB_COLS
where owner = 'ORIGINAL_SCHEMA'
and (table_name, column_name) not in
(select table_name, column_name from ALL_TAB_COLS where owner = 'HIBERNATE_SCHEMA');
上述查询的结果将为您提供 ORIGINAL_SCHEMA 中存在但 HIBERNATE_SCHEMA 中不存在的所有列。
我们由 Hibernate 映射的模式随着时间的推移而发展,我们正在使用 flyway 在不同版本之间迁移;它很好用。然后,我们在 CI-build 管道期间自动对数据库副本进行迁移,并启动休眠以验证我们的模型是否与我们的模式兼容,从而确保迁移在部署时能够正常工作。
然而,如果我们忘记删除数据库中的某个字段,但在模型中将其删除,则会出现一个问题。如果该字段是 NOT NULL 字段或外键,问题会变得更糟。
因此,我想在启动期间建立一个检查,以验证数据库不包含休眠 未知的任何字段。 Hibernates SchemaValidator 检查数据库中是否缺少任何字段,但不关心反之亦然。
关于如何编写此逻辑的任何想法。我在想我可能 SchemaValidator 来获取 DDL,但似乎有很多陷阱需要处理。
1) 从 Hibernate (hbm2dd) 生成新模式到单独的数据库 schema/user/owner。我们将其命名为 HIBERNATE_SCHEMA
.
2) 查询数据库 dictionary/metadata 以了解原始模式(我们将其命名为 ORIGINAL_SCHEMA
)和休眠模式之间的差异。例如,在 Oracle 中:
select table_name, column_name from ALL_TAB_COLS
where owner = 'ORIGINAL_SCHEMA'
and (table_name, column_name) not in
(select table_name, column_name from ALL_TAB_COLS where owner = 'HIBERNATE_SCHEMA');
上述查询的结果将为您提供 ORIGINAL_SCHEMA 中存在但 HIBERNATE_SCHEMA 中不存在的所有列。