从类创建HSQL create table查询

5

我有一个经常使用的项目正在更新中。这个项目可以安装在多个地方,并且未来不确定哪个版本会被安装在哪里以及将来可能更新到哪个版本。目前它们都是相同的。

我的问题源于Hibernate实体类可能有许多更改,必须易于更新到新版本,而不会遇到任何麻烦,并且不会丢失数据库内容。只需替换WAR文件并启动即可自动迁移。

据我所知,除非hibernate.hbm2ddl.auto=create,否则Hibernate不会更改表结构,但是这实际上会清除所有数据吗?

因此,当前Spring上下文完全加载时,它将执行一个bean,通过查找从versionX到versionY(它以前所在的版本保存在数据库中)的所有更改,并手动修改表来将数据库迁移到当前版本。

添加一些列不需要太麻烦,但是当涉及添加完整的新表时,手动编写所有内容看起来很傻...

因此,我的问题是:

  • 是否有一种方法可以向Hibernate某个代码发送实体类和方言,并获取返回用于创建表的有效SQL查询?

  • 甚至更好的是,以一种与方言兼容的方式创建用于向表中添加列的SQL字符串?

希望这不是一个愚蠢的问题,当涉及到Hibernate时我没有漏掉任何明显的东西...

4个回答

4

你尝试过吗?

hibernate.hbm2ddl.auto=update

它会保留所有带有数据的数据库,仅追加您在实体中更改的列和表。


2
也许你应该尝试一种不同的方法。不是在运行时生成模式更新,而是手动创建一个模式(可以基于 Hibernate 生成的脚本)。
在数据库中存储版本号,并为每个下一个版本创建一个更新脚本。现在你需要做的唯一事情就是确定数据库当前所处的版本,并按顺序运行必要的更新脚本,使其达到当前版本。
为了使它更加稳健,你可以编写一个单元/集成测试,运行每个可能的数据库更新,并检查所得到的数据库的完整性。
我曾经在我构建的一个应用程序中使用过这种方法,它运行得非常流畅。另一个实现此模式的例子是 Android。他们在他们的 API 中有一个升级方法。

1
我想我会把这个作为被接受的答案。遗憾的是,我感到有些奇怪给出赏金,因为它并不真正回答我的问题;而且这是我计划退而求其次的解决方案,如果我的问题确实被认为是不可能的。但我想它是最接近我的想法,不引入额外的依赖等等的解决方案。谢谢。 - Stmated
1
说真的,你应该好好看看Liquibase,特别是它的hibernate支持 - Ian Roberts
1
我已经做了,尽管在阅读文档时有些保留。可能只是因为我没有仔细阅读,没有弄清楚如何将其与我的环境混合得很好。如果情况改变,我可能会回来重新接受。 - Stmated

2
我认为你无法完全自动化这个过程。Hibernate 有 hbm2ddl 工具(可作为 ant 任务或 maven 插件),用于从 Hibernate 配置生成所需的 DDL 语句以创建空数据库,但我不知道有任何工具可以自动执行两个版本之间的“差异”比较。无论如何,最好仔细手动进行差异比较,因为只有你才足够了解你的对象模型,才能选择现有实体的新属性的正确默认值等。
一旦你确定了差异,你可以使用类似 liquibase 的工具来管理它们,并处理在应用程序启动时实际应用更新到数据库。

1
好的,我認為這是更好的答案。我仍然對Liquibase本身作為依賴或與我的Spring+Hibernate+Annotations相適應有所保留,但它在創建硬編碼SQL查詢方面做得很好,我可以用於自己的定制解決方案。謝謝。 - Stmated
1
让Hibernate自己进行自动更新在简单情况下(例如添加新的可空列)效果很好,但是它无法处理更复杂的迁移,例如重命名或删除列,更改类型等。想象一种情况,您正在添加一个新列,其值需要基于现有列中的值进行计算(而不仅仅是具有适用于所有现有行的静态默认值)。 - Ian Roberts
啊,误解了问题,以为只是从零开始创建一个工作模式。Liquibase并不是唯一的持续模式迁移管理选项。此外,它有点奇怪,因为你要用XML而不是SQL来编写模式迁移。主页上有一个很好的比较表格,介绍另一个选项flyway:http://code.google.com/p/flyway/ - sdouglass

2
不要使用Hibernate的ddl。如果您想迁移数据,它会丢弃您的数据。我建议您看一下Liquibase。Liquibase是一个数据库版本控制工具。它使用changesets来工作。每个changeset可以手动创建,或者您可以让Liquibase读取您的Hibernate配置文件并生成changeset。
Liquibase可以通过Spring启动,因此它应该适合您的项目;-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接