Grails中是否存在GORM之前的init钩子



我试图解决Grails 2.5.x应用程序中的一个非常具体的需求:我想在应用程序启动之前通过应用一系列数据库转换脚本(取决于数据库版本/应用程序版本)来升级数据库模式。我们过去在"传统"Java Servlet应用程序中这样做,但我在Grails方面有点吃力。

问题:在Grails中,我是否可以在应用程序启动期间以某种方式连接到一个事件,该事件允许我使用Groovy和现有的DataSource配置,但会在GORM/HHibernate启动之前发生?

我已经检查了一些选项:

  • BootStrap的init闭包在这里不起作用,因为如果数据库模式过期,应用程序就不会以"验证"模式启动
  • 我以前没有使用过Events.groovy,但这些事件似乎是针对grails编译/构建生命周期的,而不是打包在WAR文件中并部署到应用程序容器中的自包含应用程序
  • grails数据库迁移插件似乎是类似的,并且期望grails命令行在目标服务器上可用,并且转换由管理员手动执行<事实证明我很可能错了>

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

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

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

最新更新