从 groovy 数据库迁移调用 Grails 服务

Calling a Grails service from a groovy database migration

使用 Grails 2.3.9 我试图在数据库迁移变更集中实施 groovy 变更。它使用 Grails 服务生成 UUID。

dbm-update 执行失败,出现 "connnection proxy not usable after transaction completion" 错误。

变更集:

changeSet(author:"sola", id: "gefc.currency.defaultGlobalBaseCurrency.v49") {
    grailsChange {
      change {
        def igs = ctx.getBean("idGeneratorService")

        sql.withBatch(20,
          "INSERT INTO core_setting_value " +
            "  (id, version, module, scope, code, " +
            "   string_value, boolean_value, long_value) " +
            "VALUES " +
            "(?, 0, 'gefc.currency', 'global', ?, ?, ?, ?)"
        ) { ps ->
          ps.addBatch(igs.uuid(), "baseCurrency", \
            "HUF", null, null)
        }

        confirm 'Base currency configuration (global setting)'
      }
    }
  }

根本问题是变更中的 groovy 代码干扰了 Liquibase(运行变更集)的事务管理。

将服务方法设为非事务性后,变更集运行良好。