Grails FAQ说:
问:如何从src / groovy中的源代码访问域类?
有时,您正在开发一些生活在src / groovy中的实用程序类,您打算从服务和其他工件中使用它们。但是,由于这些类是由Grails预编译的,因此无法实例化它们并编写类似Book.findByTitle(“Groovy in> Action”)的内容。但幸运的是,有一种解决方法,因为它可以这样做:
import 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使用域类吗?
答案 0 :(得分: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。