默认情况下,当您创建域类时,它会自动为所有域类(表)添加“id”和“version”列。如果我想添加一个列,比如“isChecked”,这应该自动添加到所有域类(即表)中,类似于添加“id”和“version”列的方式。我怎样才能做到这一点,而且如果我不想为特定的域类设置“isChecked”,我也应该能够做到这一点。
我如何在 Grail 1.3.7 中做到这一点?
谢谢你。杰伊·钱德兰
编辑:我可以获得更多输入吗?建议的答案无效!
默认情况下,当您创建域类时,它会自动为所有域类(表)添加“id”和“version”列。如果我想添加一个列,比如“isChecked”,这应该自动添加到所有域类(即表)中,类似于添加“id”和“version”列的方式。我怎样才能做到这一点,而且如果我不想为特定的域类设置“isChecked”,我也应该能够做到这一点。
我如何在 Grail 1.3.7 中做到这一点?
谢谢你。杰伊·钱德兰
编辑:我可以获得更多输入吗?建议的答案无效!
您可以使用 Groovy 为此类事情提供的元编程魔法,但是,我可能会走更典型的路线并使用继承。创建一个包含 isChecked (以及您需要的任何其他内容)的父域,并让需要它们的域扩展该类。
我建议创建一个插件来修改(添加属性)您的域工件。您可以阅读有关插件和工件的更多信息。然后,您可以轻松地添加一个静态属性(例如 static nochecked = true),以过滤掉您不希望添加新属性的域工件。
您可以使用元编程来做到这一点。添加属性的代码应该在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”开头的域类添加一个属性。我没有测试过这段代码,所以它可能不起作用。要查看一个您可以更有信心的示例:
doWithDynamicMethods
闭包中的代码