查找数据库DDL中未映射的字段



Hibernate映射的模式随着时间的推移而演变,我们正在使用flyway在不同版本之间迁移;效果很好。然后,在ci构建管道期间,我们自动在数据库副本上执行迁移,并启动hibernate来验证我们的模型与模式是否兼容,从而确保迁移在部署时能够正常工作。

但是,如果我们忘记在数据库中删除字段,但在模型中删除它,则会出现一个问题。如果字段是NOT NULL字段或外键,问题会变得更糟。因此,我想在启动期间构建一个检查,以验证数据库不包含hibernate未知的任何字段。Hibernates SchemaValidator检查数据库中没有字段丢失,但不关心反之亦然。

知道我该怎么写这个逻辑吗?我想我可能会SchemaValidator来获得DDL,但是似乎有许多陷阱需要注意。

1)从Hibernate (hbm2dd)生成一个新的模式到一个单独的数据库模式/用户/所有者。让我们命名为HIBERNATE_SCHEMA

2)查询数据库字典/元数据,查找原始模式(我们将其命名为ORIGINAL_SCHEMA)与hibernate模式之间的差异。例如,在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中的所有列。

最新更新