【问题标题】:Is there a pre-GORM init hook in Grails?Grails 中有 pre-GORM init 钩子吗?
【发布时间】:2016-05-10 10:08:11
【问题描述】:

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

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

我已经检查过的一些选项:

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

【问题讨论】:

  • 实际上,您可以在应用启动时自动运行数据库迁移,而不是纯手动。我建议你再看看这个插件,因为它正是你要找的。​​span>
  • 谢谢你 Joshua - 我会去看看!在快速阅读插件描述后,我可能得到了错误的想法。
  • grails.plugin.databasemigration.updateOnStartFileNames = ['your-db-specific-changelog-filename.groovy']

标签: grails


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2021-03-19
    • 2014-02-15
    • 1970-01-01
    • 2015-10-27
    • 2013-11-13
    • 1970-01-01
    相关资源
    最近更新 更多