【问题标题】:Find unmapped fields in database DDL在数据库 DDL 中查找未映射的字段
【发布时间】:2015-10-13 15:02:23
【问题描述】:

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

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

因此,我想在启动期间构建一个检查,以验证数据库不包含任何休眠未知的字段。 Hibernates SchemaValidator 检查数据库中没有丢失任何字段,但反之亦然。

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

【问题讨论】:

  • 当我在 google 中进行依赖注入搜索时,我总是输入关键字“自定义”。在这种情况下,“休眠 CustomSchemaValidator”即gist.github.com/jelies/8951881

标签: java hibernate jpa ddl


【解决方案1】:

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 中不存在的所有列。

【讨论】:

  • 聪明的方法。我将无法这样做,因为 DDL 上的某些内容与 hibernate 生成的内容不同。例如外键名称。更新模型可能是唯一的方法,但这将是一项艰巨的任务,因此非常欢迎其他建议:)
  • 我无法想出比您更好的解决方案 - 我已经意识到拥有 100% 注释模型的一些不错的副作用。因此,我们将继续对模型的其余部分进行注释(主要是必须设置索引和外键名称)。
猜你喜欢
  • 2012-10-28
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
相关资源
最近更新 更多