我正在使用一个目前正在更新的项目。有几个地方可以安装这个项目,并且将来不确定将来可以更新的版本和版本。但是现在他们都是一样的。
我的问题源于这样一个事实,即hibernate实体类可能会有很多变化,并且必须很容易更新到更新的版本而不会有任何麻烦,并且不会丢失数据库内容。只需替换WAR并启动它就应该自行迁移。
据我所知,除非 hibernate.hbm2ddl.auto = create ,否则Hibernate不会更改表,但实际上会抛弃所有数据?
所以现在当Spring上下文完全加载时,它会执行一个bean,它将数据库迁移到当前版本,方法是执行从versionX到versionY的所有更改(以前的版本保存在数据库中),并手动更改表格。
使用一些硬编码的ALTER TABLE来添加一些列并不是很麻烦,但是当谈到添加完整的新表时,必须编写所有这些内容感觉很蠢......
所以我的问题是:
有没有办法将实体类和方言发送给Hibernate 代码在哪里,并获取有效的SQL查询来创建表?
更好的是,以某种方式创建一个SQL字符串,用于向表中添加列,dialect-safe?
我希望这不是一个愚蠢的问题,在Hibernate方面我没有错过任何明显的东西...
答案 0 :(得分:4)
你试过吗
hibernate.hbm2ddl.auto=update
它使用数据保留所有数据库,并仅附加您在实体中更改的列和表。
答案 1 :(得分:2)
也许你应该尝试不同的方法。而不是在运行时更新时生成模式,而是“手动”创建模式(尽管可以基于hibernate生成的脚本)。
在数据库中存储版本号,并为每个下一版本创建更新脚本。您现在唯一需要做的就是确定数据库当前所处的版本,并依次运行必要的更新脚本以使其达到当前版本。
为了使其更加强大,您可以进行单元/集成测试,该测试运行每个可能的数据库更新并检查生成的数据库的完整性。
我将这个方法用于我构建的应用程序,它可以完美运行。 Android模式的另一个实现示例是Android。他们的API中有升级方法
答案 2 :(得分:2)
我认为你不能完全自动化这个。 Hibernate有hbm2ddl工具(可用作ant任务或maven插件)从你的hibernate配置生成所需的DDL语句来创建一个空的数据库,但我不知道任何可以在两个之间自动“diff”的工具版本。在任何情况下,你最好小心谨慎地做差异,因为只有你知道你的对象模型才能为现有实体的新属性选择正确的默认值等。
完成差异后,您可以使用liquibase之类的工具来管理它们,并在应用程序启动时处理实际应用更新到数据库。
答案 3 :(得分:2)
不要使用Hibernate的ddl。如果要迁移,它会丢弃您的数据。我建议你看看Liquibase。 Liquibase是一个数据库版本控件。它使用变更集。每个变更集都可以手动创建,或者您可以让Liquibase读取您的Hibernate配置并生成变更集。
Liquibase可以通过Spring启动,因此它应该适合您的项目; - )