2014-01-22 81 views
0

我正在尝试将Liquibase与Spring/Hibernate Web应用程序集成以取代我们现有的本地解决方案。到目前为止,Liquibase非常棒,但有一个对我们很重要的用例,我不知道Liquibase是否支持它,这就是:在不同版本的多个数据库上运行liquibase

我们将web应用程序部署到托管webapp的客户端,数据库(MySQL)本身。因此,假设我们使用新的干净数据库模式(由Hibernate映射生成)和Liquibase变更集中没有项目部署到我们的第一个客户端(client1)。然后,我们开发一些模式更改并将应用程序重新部署到client1,并且liquibase完成它的工作并应用更改集 - 这一切都很棒。

现在,我们再次使用从Hibernate映射生成的新数据库模式部署到新客户端client2。但是这一次出现了变更集(针对客户端1和客户端2部署之间的更改),但不需要应用它们,因为它们已经在新模式中)。但是,由于DATABASECHANGELOG表为空,因此Liquibase会尝试应用更改集,并可能因SQL错误而失败。 我们希望新部署到新客户端的'知道'他们是什么变化(相对于第一次部署到客户端1),所以它只适用于后续更新。

似乎有对这个几种可能性,大概我没有想到的:

  • 假冒项填入DATABASECHANGELOG愚弄Liquibase以为这些都已经得到了应用。

  • 始终将我们的第一个基准原始模式部署到后续客户端,并按顺序运行更新,因此不要在client1之后部署从Hibernate映射派生的“新”模式。

  • 使用我们自己的跟踪系统(例如,将db版本映射到应用程序版本,将db版本映射到变更集)。

这是一个问题,或者我只是不理解如何正确使用Liquibase?对于以前处理过这种用例的人的任何建议,我们将不胜感激。如果可能的话,我们真的想避免部署特定的changeSets - 即使不是数百个部署,也要处理数十个部署。

感谢, 理查德

回答

2

我们有类似的设置。 但是我们早些时候已经开始使用liquibase进入游戏。在我们正式发布软件之前,我们设置了liquibase变更集并让liquibase处理数据库。

我们不想失去让hibernate在开发阶段生成数据库的好处。所以我们也在开发时使用Hibernate。

但是在版本稳定之前,我们让liquibase diff工具在数据库上运行,并让它为hibernate生成的表创建一个变更集。 然后,由于liquibase diff工具确实会产生一些缺陷,因此可以手动更正此更改集。

一旦变更集准备好了,我们就会将这个软件发送给我们。

我们维护一个参考系统,保留上一次正式发布版本的数据库版本。然后,对于下一个版本,我们让liquibase diff工具在当前开发版本的参考数据库下运行。这为下一个版本带来了不同。这也是手动更正的,最后你会有一个变更集将数据库更改为下一个版本。

希望这给你一个使用liquibase和hibernate的方法。

+0

感谢您的建议 - 我们已经建立了第二个开发数据库,​​我们可以使用它与hibernate生成的表进行比较,并在提交之前测试liquibase更新,然后我们将看到这是如何工作的。 。 – otter606

0

对于上面的选项1(用假条目填充)我刚刚发现的changelogSync命令,它看起来像应用它标志着所有变更项目,即使他们没有。

但是,这是比从基准模式真正应用更改更好还是更差?

0

我通常建议总是对所有不同的数据库运行相同的更新日志文件。这样您就不必处理手动将changeSets标记为已运行,使用前置条件或其他任何东西。最重要的是,每个数据库都将遵循相同的升级路径,因此您知道它们将一致地更新而不会出现任何意外问题。

您可以使用liquibase hibernate extension根据你的Hibernate映射,自动追加变更到你的更新日志,但是当谈到时间更改部署到数据库您刚刚运行liquibase更新日志文件,而不是尝试使用Hibernate的架构生成逻辑在所有。

相关问题