3.3.3.2. Groovy 脚本的结构

Groovy 更新脚本的结构如下:

  • 主要(main) 部分,包含要在应用程序上下文启动之前执行的代码。在这一部分,可以使用任何 Java、Groovy 和 Middleware 应用程序块(block)中的类。但要注意,这时尚未实例化 bean、基础设施接口和其它应用程序对象,所以无法使用它们。

    这部分主要用于更新数据库 schema,通常使用普通的 SQL 脚本。

  • PostUpdate 部分 - 一组闭包(Groovy 中的概念),将在应用程序上下文启动后和更新过程完成后执行。在这些闭包中,可以使用任何中间件对象。

    在脚本的这一部分中,可以比较方便地执行数据导入,因为可以使用Persistence接口和数据模型对象。

执行机制将以下变量传递给 Groovy 脚本:

  • ds – 用于应用程序数据库的 javax.sql.DataSource 实例;

  • logorg.apache.commons.logging.Log 实例,用于在服务端日志中输出信息;

  • postUpdate – 包含 add(Closure closure) 方法的对象,用于添加上述 PostUpdate 闭包。

Groovy 脚本仅由执行数据库脚本的服务端机制执行。

Groovy 更新脚本的示例:

  1. import com.haulmont.cuba.core.Persistence
  2. import com.haulmont.cuba.core.global.AppBeans
  3. import com.haulmont.refapp.core.entity.Colour
  4. import groovy.sql.Sql
  5. log.info('Executing actions in update phase')
  6. Sql sql = new Sql(ds)
  7. sql.execute """ alter table MY_COLOR add DESCRIPTION varchar(100); """
  8. // Add post update action
  9. postUpdate.add({
  10. log.info('Executing post update action using fully functioning server')
  11. def p = AppBeans.get(Persistence.class)
  12. def tr = p.createTransaction()
  13. try {
  14. def em = p.getEntityManager()
  15. Colour c = new Colour()
  16. c.name = 'yellow'
  17. c.description = 'a description'
  18. em.persist(c)
  19. tr.commit()
  20. } finally {
  21. tr.end()
  22. }
  23. })