如何使用Hibernate创建数据库架构

阅读Hibernate之后:hbm2ddl.auto =生产中的更新? 出现了一些问题。 首先,我使用Hibernate的原因是独立于数据库供应商(不需要编写10个版本的“相同”sql查询,例如.tsql vs sql)。

在创建数据库模式(生产环境)时出现我的问题。 据我所知,我有两种选择。

  1. hbm2dll =更新
  2. 纯sql(ddl)脚本。

第一种选择在上面的主题中被广泛讨论。 第二种选择是坏的,因为这意味着我回到了我的第一个问题:“不想创建依赖于数据库供应商的sql语句”。 (如果“all”(数据库Hibernate支持)正在实现DDL (用于定义和检查数据库结构的SQL子集),则此语句可能为false。)相等)。

在开发/暂存模式下进行所有更改,并手动(或自动,但不要让hibernate运行它们)在生产中传输和执行脚本。 脚本可能需要一些调整,因为hbm2ddl update不包括所有情况。

实际上我从不让hibernate对任何数据库运行ddl。 我使用hbm2ddl生成文本:

org.hibernate.tool.hbm2ddl.SchemaExport --config=hibernate.cfg.xml --text --format --delimiter=; org.hibernate.tool.hbm2ddl.SchemaUpdate --config=hibernate.cfg.xml --text --format --delimiter=; 

如何在不丢失Hibernate数据的情况下更新数据库模式?

通常,转储JPA模式的工具基于SchemaExport工具,该工具仅读取静态元数据。

有一个Maven / Gradle插件https://github.com/Devskiller/jpa2ddl ,它生成JPA模式。 包括所有属性,命名策略,用户类型等。

您还可以使用它为Flyway生成自动架构迁移。

我喜欢Hibernate(很多),我认为它会产生一些令人难以置信的高质量代码,但我不会在生产数据库上放松它,而不是让一个非常有礼貌的灰熊保姆。 一切都可以在一段时间内变得很好,但是一次变坏的事件真的很糟糕。

我的建议是在测试环境中,让hibernate生成数据库模式。 在测试环境中测试那些。 然后将这些脚本带到生产环境并运行它们。 注意那里的特异性; 即使测试成功,我仍然不会让Hibernate在生产服务器上疯狂。 获取Hibernate schemagen的输出,测试它,一旦validation,然后将其部署到生产服务器。