【问题标题】:Grails - adding custom fields (columns) to all domain objects - automaticallyGrails - 将自定义字段(列)添加到所有域对象 - 自动
【发布时间】:2011-08-08 14:55:56
【问题描述】:

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

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

谢谢。 杰伊·钱德兰

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

【问题讨论】:

  • 我可以得到更多的输入吗?建议的答案无效!

标签: grails grails-domain-class


【解决方案1】:

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

【讨论】:

  • 而且您很可能希望在父类的 mapping 闭包中禁用每层表方案,以支持每子类表方案。
  • @Jay Chandran 在GORM docs 中有一个例子。第 5.5.2.3 节。
  • @codelark 我有一个带有 isChecked 的 ParentDomain 类和一个扩展父域类并具有诸如 first_name 的字段的 ChildDomain 类。我添加了 tablePerHierarchy false,当我在数据库中看到时,我看到 parent_domain 表包含列“id”、“version”和“is_checked”,而 child_domain 表包含列“id”和“first_name”列。 “is_checked”列未在“child_domain”表中创建。为什么会这样?
  • 将基类放在 src/groovy 中,这样 Hibernate 继承就不会发挥作用。这样,您只需使用常规 Java/Groovy 继承和共享字段/getter/setter。
  • @Burt Beckwith 但是 child_domain 表仍然没有“is_checked”列。我错过了什么吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可以使用元编程来做到这一点。添加属性的代码应该在插件的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}
      }
    }
    

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

    1. 查找添加修改域类的插件(例如添加字段或方法)
    2. 下载
    3. 查看插件描述符的doWithDynamicMethods闭包中的代码
    4. 复制、粘贴并适应您的需求

    【讨论】:

    • Hibernate 看不到这个,所以它不能用于持久化。
    猜你喜欢
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多