【问题标题】:Domain class constructors in Grails?Grails中的域类构造函数?
【发布时间】:2014-05-26 23:46:50
【问题描述】:

我有一些代码要在创建域类对象时运行;在 Java 中,我会在构造函数中包含此代码。我如何在 Groovy/Grails 中做到这一点?

谢谢。

【问题讨论】:

  • 您希望这种自定义初始化在 Hibernate(从数据库)创建实例时发生,还是在使用 new 以编程方式创建(瞬态)实例时发生?

标签: grails groovy grails-orm


【解决方案1】:

您可以向域类添加构造函数,但如果默认的无参数构造函数尚不存在,则还必须添加它。

//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')

【讨论】:

  • 谢谢,但我怎样才能继续用地图实例化对象,并且仍然有一些构造函数的代码?
  • 我们不能在域类本身中覆盖映射构造函数,因为映射构造函数被添加到 groovy 类(在本例中为 grails 域类)的元类中。但是您可以将元类上的构造函数覆盖为shown here in this blog。您必须在 BootStrap.groovy 中为该特定域类添加该逻辑。
  • 您使用了 groovy 元编程的力量!没有要定义的构造函数,只需使用构造函数调用域...
  • @danielad 我真的希望 java 有这个功能。 Eclipse 自动生成可以解决问题,但 groovy 的自动生成要容易得多。
【解决方案2】:

你见过this page 谈论 groovy 构造函数吗?我已经使用这种技术成功地将映射构造函数添加到 Grails 域类。

This article 包含一个很好的示例并突出了一个重要问题。如果您想禁用 Grails 域类的映射构造函数(我认为这不是一个特别好的主意),您可以尝试抛出运行时异常而不是返回一个新实例。或者,让您的地图构造函数整理数据并调用您的其他构造函数之一。

【讨论】:

    【解决方案3】:

    根据具体的用例,您可以使用 GORM 事件 ...

    http://docs.grails.org/3.1.1/guide/single.html#5.5.1

    所以你可以使用

    def beforeInsert() {
        doMyCustomThing()
    }
    
    def onLoad() {
        doMyCustomThing()
    }
    

    还有一些其他选项,包括 Hibernate 事件和自定义 GORM 事件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多