Java 在数据库DDL中查找未映射的字段
我们的模式由Hibernate映射,随着时间的推移不断发展,我们使用flyway在不同版本之间迁移;它工作得很好。然后,在CI构建管道期间,我们会自动在数据库副本上执行迁移,并启动hibernate以验证我们的模型是否与模式兼容,从而确保在部署时迁移能够正常工作 但是,如果我们忘记删除数据库中的字段,而在模型中删除它,则会出现一个问题。如果该字段是非空字段或外键,问题会变得更严重 因此,我希望在启动期间生成一个检查,以验证数据库不包含任何hibernate未知的字段。Hibernates SchemaValidator检查数据库中是否没有缺少字段,但不关心vise,反之亦然 你知道我该怎么写这个逻辑吗。我想我可以使用SchemaValidator来获得DDL,但似乎有很多陷阱需要注意。1)从Hibernate(hbm2dd)生成一个新的模式,并将其转换为一个单独的数据库模式/用户/所有者。让我们把它命名为Java 在数据库DDL中查找未映射的字段,java,hibernate,jpa,ddl,Java,Hibernate,Jpa,Ddl,我们的模式由Hibernate映射,随着时间的推移不断发展,我们使用flyway在不同版本之间迁移;它工作得很好。然后,在CI构建管道期间,我们会自动在数据库副本上执行迁移,并启动hibernate以验证我们的模型是否与模式兼容,从而确保在部署时迁移能够正常工作 但是,如果我们忘记删除数据库中的字段,而在模型中删除它,则会出现一个问题。如果该字段是非空字段或外键,问题会变得更严重 因此,我希望在启动期间生成一个检查,以验证数据库不包含任何hibernate未知的字段。Hibernates Sch
HIBERNATE\u 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');
上述查询的结果将为您提供原始_模式中存在的所有列,而HIBERNATE_模式中不存在这些列。在google中进行依赖项注入搜索时,我总是输入关键字“Custom”。在本例中,“hibernate CustomSchemaValidator”即聪明的方法。我不能这样做,因为DDL上的一些内容与hibernate生成的内容不同。e、 g.外键名称。更新模型可能是唯一的方法,但这将是一项相当艰巨的任务,因此其他建议非常受欢迎:)我没能想出比你更好的解决方案——我已经意识到,拥有一个100%注释的模型会产生一些很好的副作用。因此,我们将继续注释模型的其余部分(主要是必须设置索引和外键名)。