Grails中是否有一个pre-GORM init钩子?

时间:2016-05-10 10:08:12

标签: grails

我正在尝试解决Grails 2.5.x应用程序中的一个非常具体的要求:我想在应用程序启动之前通过应用一系列数据库转换脚本来升级数据库架构(取决于数据库版本/应用程序)版)。我们过去在一个“传统的”Java Servlet应用程序中做过这个,但是我在Grails中苦苦挣扎。

问题:在Grails中有一个事件,我可以在应用启动期间以某种方式挂钩,这将允许我使用Groovy和现有的DataSource配置,但是会在GORM / Hibernate之前发生开始了?

我已经检查了一些选项:

  • BootStrap的初始化关闭在这里不起作用,因为如果数据库架构已过期,应用程序根本不会以“验证”模式启动。
  • 我之前没有使用过Events.groovy,但似乎这些事件的目标是grails编译/构建生命周期,而不是打包在WAR文件中并部署到app容器的自包含应用程序。
  • grails database-migration插件似乎相似,并希望Grails命令行在目标服务器上可用,并且转换由管理员手动执行事实证明我在这里很可能是错的。

1 个答案:

答案 0 :(得分:0)

虽然我还没有找到一种方法在GORM启动之前挂钩Grails启动(并执行数据库验证或创建),但有一种方法可以通过BootStrap init执行自定义数据库迁移代码,只需禁用所有Hibernate的hbm2ddl(只省略任何有效的dbCreate值)。

对于我们的项目,我们最终使用数据库迁移插件,但我很快意识到要使其正常工作,您还必须禁用hhm2ddl。如果使用validate选项,GORM将在数据库迁移发生之前尝试验证数据库,并且应用程序将无法启动。

因此,如果想要提供数据库升级/迁移代码的自定义实现,则可以使用相同的方法 - 禁用hbm2ddl将允许它在不干扰hibernate的数据库模式验证的情况下运行。明显的缺点是无法再使用验证模式。