7

Grails常见问题解答是这样说的:

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

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

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

//…</p>

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

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

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

Book.findByTitle("Groovy in Action")

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

4

1 回答 1

6

你是对的,你指的是一个过时的信息。您可以在定义的类中使用域类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

于 2013-06-19T19:53:24.023 回答