【发布时间】:2014-05-26 23:46:50
【问题描述】:
我有一些代码要在创建域类对象时运行;在 Java 中,我会在构造函数中包含此代码。我如何在 Groovy/Grails 中做到这一点?
谢谢。
【问题讨论】:
-
您希望这种自定义初始化在 Hibernate(从数据库)创建实例时发生,还是在使用
new以编程方式创建(瞬态)实例时发生?
标签: grails groovy grails-orm
我有一些代码要在创建域类对象时运行;在 Java 中,我会在构造函数中包含此代码。我如何在 Groovy/Grails 中做到这一点?
谢谢。
【问题讨论】:
new 以编程方式创建(瞬态)实例时发生?
标签: grails groovy grails-orm
您可以向域类添加构造函数,但如果默认的无参数构造函数尚不存在,则还必须添加它。
//Domain Class
class Author {
String name
Author() {
//Execute post creation code
}
Author(String _name) {
name = _name
//Execute post creation code
}
}
另一方面,域类是 POGO,因此如果在创建对象时不需要执行额外的逻辑,您也可以使用映射构造函数。在不添加任何构造函数的情况下,您也可以将Author 实例化为:
Author(name: 'John Doe')
【讨论】:
BootStrap.groovy 中为该特定域类添加该逻辑。
你见过this page 谈论 groovy 构造函数吗?我已经使用这种技术成功地将映射构造函数添加到 Grails 域类。
This article 包含一个很好的示例并突出了一个重要问题。如果您想禁用 Grails 域类的映射构造函数(我认为这不是一个特别好的主意),您可以尝试抛出运行时异常而不是返回一个新实例。或者,让您的地图构造函数整理数据并调用您的其他构造函数之一。
【讨论】:
根据具体的用例,您可以使用 GORM 事件 ...
http://docs.grails.org/3.1.1/guide/single.html#5.5.1
所以你可以使用
def beforeInsert() {
doMyCustomThing()
}
def onLoad() {
doMyCustomThing()
}
还有一些其他选项,包括 Hibernate 事件和自定义 GORM 事件
【讨论】: