2

默认情况下,当您创建域类时,它会自动为所有域类(表)添加“id”和“version”列。如果我想添加一个列,比如“isChecked”,这应该自动添加到所有域类(即表)中,类似于添加“id”和“version”列的方式。我怎样才能做到这一点,而且如果我不想为特定的域类设置“isChecked”,我也应该能够做到这一点。

我如何在 Grail 1.3.7 中做到这一点?

谢谢你。杰伊·钱德兰

编辑:我可以获得更多输入吗?建议的答案无效!

4

3 回答 3

3

您可以使用 Groovy 为此类事情提供的元编程魔法,但是,我可能会走更典型的路线并使用继承。创建一个包含 isChecked (以及您需要的任何其他内容)的父域,并让需要它们的域扩展该类。

于 2011-08-08T15:04:53.063 回答
0

我建议创建一个插件来修改(添加属性)您的域工件。您可以阅读有关插件和工件的更多信息。然后,您可以轻松地添加一个静态属性(例如 static nochecked = true),以过滤掉您不希望添加新属性的域工件。

于 2011-08-08T15:15:52.267 回答
-1

您可以使用元编程来做到这一点。添加属性的代码应该在doWithDynamicMethods插件的闭包中或从Bootstrap.groovy. 如果使用插件方法,这样的事情应该可以工作:

def doWithDynamicMethods = {ctx ->
  application.domainClasses
        .findAll {it.simpleName.startsWith('S')}.metaClass.each {domainMetaClass ->

    Integer fooVal = 0

    domainMetaClass.getFoo = {-> fooVal}
    domainMetaClass.setFoo = {Integer newFooVal -> fooVal = newFooVal}
  }
}

Integer foo上面的代码应该为每个名称以“S”开头的域类添加一个属性。我没有测试过这段代码,所以它可能不起作用。要查看一个您可以更有信心的示例:

  1. 查找添加修改域类的插件(例如添加字段或方法)
  2. 下载它
  3. 查看插件描述符doWithDynamicMethods闭包中的代码
  4. 复制、粘贴和适应您的需求
于 2011-08-08T15:29:30.347 回答