Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在数据库DDL中查找未映射的字段_Java_Hibernate_Jpa_Ddl - Fatal编程技术网

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

Java 在数据库DDL中查找未映射的字段,java,hibernate,jpa,ddl,Java,Hibernate,Jpa,Ddl,我们的模式由Hibernate映射,随着时间的推移不断发展,我们使用flyway在不同版本之间迁移;它工作得很好。然后,在CI构建管道期间,我们会自动在数据库副本上执行迁移,并启动hibernate以验证我们的模型是否与模式兼容,从而确保在部署时迁移能够正常工作 但是,如果我们忘记删除数据库中的字段,而在模型中删除它,则会出现一个问题。如果该字段是非空字段或外键,问题会变得更严重 因此,我希望在启动期间生成一个检查,以验证数据库不包含任何hibernate未知的字段。Hibernates Sch

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

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

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

你知道我该怎么写这个逻辑吗。我想我可以使用SchemaValidator来获得DDL,但似乎有很多陷阱需要注意。

1)从Hibernate(hbm2dd)生成一个新的模式,并将其转换为一个单独的数据库模式/用户/所有者。让我们把它命名为
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%注释的模型会产生一些很好的副作用。因此,我们将继续注释模型的其余部分(主要是必须设置索引和外键名)。