【问题标题】:Gorm mapping for inheritance继承的 Gorm 映射
【发布时间】:2013-12-30 12:22:37
【问题描述】:

我在 Grails 中遇到了关于继承的问题。 我有一个域类 Person.grooy:

class Person{
    String name
    String contactNumber
    Address address
} 

现在我正在为 Employee 和 Customer 扩展 Person.groovy,例如:

class Employee extends Person{
    String designation
}
class Customer extends Person{
    String interest
}

现在我想在我的数据库中为 Employee 和 Customer 提供单独的表,其中包含 Person 列,即 name、contactNumber 和关联地址键。 我怎么能做到这一点。我搜索了所有地方,但没有这方面的内容。 这种方法在 GORM 中是不可能的吗? 请回答。 谢谢各位

【问题讨论】:

    标签: grails grails-orm grails-domain-class


    【解决方案1】:

    最后,我通过在我的子域类中添加grails.persistence.Entity 注释来获得我想要的东西。我还让我的父母,即 Person.groovy 抽象并放在 src/groovy 中。

    现在我有了预期的数据库层次结构,但控制器中的一些脚手架问题仍然存在,在您的帮助下也将得到解决。

    【讨论】:

      【解决方案2】:

      如果您将 Person 类放在 src/java 或 src/groovy 中,它将不会映射到 db。

      记得将它导入到您的 Employee 和 Customer 类中

      import com.yourPackage.Person
      
      class Employee extends Person{
      
      }
      

      【讨论】:

      • 是的,我尝试了所有方面。将我的父类,即 Person.groovy 放入 src/groovy 并将它们导入子类,但数据库中没有映射。我还尝试将域类作为抽象然后扩展但没有运气。感谢伙伴的时间和考虑。希望我们能得到解决方案。 :)
      【解决方案3】:

      您需要禁用每个层次结构的 table-per-hierarchy,它在 Grails 中默认启用

      class Employee extends Person{
          String designation
      
      static mapping = {
              tablePerHierarchy false
          }
      }
      

      table-per-hierarchy Ref

      【讨论】:

      • 是的,我已经尝试过了。它将为每个域类分别创建表,如 Person 它具有三列名称,contact_number,address_id。以及员工表中的一列用于指定。还有一列是对 Customer 表的兴趣。
      • 我希望 Employee 表应该有列名、contact_number、address_id 和 designation。而且应该没有 Person.groovy 的表
      【解决方案4】:

      看起来继承不是我们需要遵循的方法。您应该使用 Person 类创建组合,它将把 Person 类的属性存储在 Employee 中。

      class Employee {
          Person person
          String designation
      
          static embedded = ['person']
      }
      

      Gorm Composition

      【讨论】:

        【解决方案5】:

        您可以将它放在 src/java 中,但该解决方案将不是标准的,因为一旦您深入了解应用程序,它就不会被视为 grails 域示例。

        例如,如果你想按照上一个答案在扩展域上创建一个控制器或者一个测试脚本,那就很复杂了。

        我相信从 grails 2.2.x 开始,grails 为您提供了 ma​​pWith。您可以将其用于更易于维护的解决方案

        class Employee{
        static mapWith = "none"
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-07
          • 2011-11-22
          • 2010-11-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多