2015-10-13 192 views
0

我们的架构是由Hibernate映射正在演变随着时间的推移,我们正在使用的飞行路线不同版本之间迁移;它的效果很好。然后,我们会在我们的CI构建管道中自动对数据库的副本进行迁移,然后启动hibernate以验证我们的模型与我们的模式是否兼容,从而确保迁移在部署时可以正常工作。查找数据库DDL映射字段

然而有一个问题,如果我们忘记删除数据库中的一个领域,但在模型中取出。如果该字段是NOT NULL字段或外键,问题会变得更糟。

因此,我想在启动过程中建立一个检查,验证数据库不包含任何休眠未知的字段。 Hibernates SchemaValidator检查数据库中没有字段缺失,但不关心反斜杠。

任何想法,我可能会写这个逻辑。我在想,我可能SchemaValidator得到的DDL,但似乎有很多缺陷照顾。

+0

当我在Google中进行依赖注入搜索时,我总是将关键字'自定义'。在这种情况下,“hibernate CustomSchemaValidator”即https://gist.github.com/jelies/8951881 – HRgiger

回答

0

1)生成从休眠(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'); 

上述查询的结果会给你的存在不中HIBERNATE_SCHEMA存在ORIGINAL_SCHEMA的所有列。

+0

聪明的方法。我不能这样做,因为DDL上的某些内容与休眠会产生的内容不一样。例如外键名称。更新模型可能是唯一的方法,但这将是一项相当艰巨的任务,所以其他建议非常受欢迎:) – smox

+0

我还没有能够想出比您更好的解决方案 - 而且我已经意识到了一些有一个100%注释模型的好的副作用。因此,我们将继续注释模型的其余部分(主要指标和外键名称必须设置)。 – smox