【问题标题】:Grails: What is the best way to access domain classes from a src/groovy class?Grails:从 src/groovy 类访问域类的最佳方式是什么?
【发布时间】:2013-06-16 12:05:11
【问题描述】:

圣杯FAQ 这么说:

问:如何从 src/groovy 中的源访问域类?

有时,您正在开发一些实用程序类,它们存在于 src/groovy 中,并且您打算 > 从服务和其他工件中使用它们。但是,由于这些类是由 Grails 预编译的,因此无法实例化它们并编写诸如 Book.findByTitle("Groovy in >Action") 之类的东西。但幸运的是,有一种解决方法,因为可以这样做:

导入 org.codehaus.groovy.grails.commons.ApplicationHolder

//…

def book = ApplicationHolder.application.getClassForName("library.Book").findByTitle("Groovy in Action")

应用程序必须在动态 Gorm 方法正常运行之前完成引导。

但是,我似乎可以直接导入域对象并在我的 src/groovy 类中使​​用 GORM 方法而没有任何问题,例如:

Book.findByTitle("Groovy in Action")

由于 ApplicationHolder 已被弃用,此建议肯定已过时,但仍有任何理由避免直接从 src/groovy 使用域类?

【问题讨论】:

  • 旧版本的 grails 通过对人工制品 (grails-app) 和非人工制品 (src/groovy) 类使用不同的类加载器,在开发模式下实现了修改后的人工制品的自动重新加载。较新的 grails 版本使用基于代理的重新加载方法,而这一切都在一个类加载器中。

标签: grails grails-orm


【解决方案1】:

你是对的,你指的是一个过时的信息。您可以在src/groovy 下定义的类中使用域类。

唯一的开销是您必须手动处理transactions。相反,services 内的grails-app/services 默认处理事务。当 transactional 标志设置为 true(默认为 true,未指定任何内容)时,服务会处理事务。

另一方面,当您从src/groovy 访问域类时,您必须使用withTransaction 块手动处理事务..

Book.withTransaction{status->
    def book = Book.findByTitle("Groovy in Action")
    book.title = "Grails in Action"
    book.save()

    status.setRollbackOnly() //Rolls back the transaction
}

详情请参考withTransaction

【讨论】:

  • 适用于 Grails 3.3.5
猜你喜欢
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多