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

时间:2015-10-13 15:02:23

标签: java hibernate jpa ddl

我们的Hibernate映射架构随着时间的推移而不断发展,我们正在使用flyway在不同版本之间进行迁移;它很棒。然后,我们在CI构建管道中自动对数据库副本进行迁移,并启动hibernate以验证我们的模型是否与我们的模式兼容,从而确保迁移在部署时能够正常工作。

如果我们忘记删除数据库中的字段,但在模型中将其删除,则会出现一个问题。如果该字段是 NOT NULL 字段或外键,则问题会变得更糟。

因此,我希望在启动期间构建一个检查,以验证数据库是否包含hibernate未知的任何字段。 Hibernates SchemaValidator 检查数据库中是否缺少任何字段,但不关心反之亦然。

任何想法我如何写这个逻辑。我想我可能 SchemaValidator 来获取DDL,但似乎有很多陷阱需要处理。

1 个答案:

答案 0 :(得分:0)

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

2)查询数据库字典/元数据,了解原始文件(让我们命名为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中不存在。