继承抽象类的Grails域hasMany

时间:2013-09-26 19:07:58

标签: grails inheritance abstract grails-domain-class

所以我试图让2个域从单个域继承。

abstract class Pet {
    Nose nose
    static hasMany = [legs: Leg]
}

class Dog extends Pet {
    static hasMany = [friends: Friend]
}

我收到了一个错误:

Caused by: org.codehaus.groovy.grails.exceptions.InvalidPropertyException: No property found for name [legs] for class [class animals.Dog]

有什么想法吗?我有什么必须要结合hasManys吗?

2 个答案:

答案 0 :(得分:0)

我尝试复制问题并且没有得到InvalidPropertyException,但生成的数据库架构缺少DogLeg之间的1:m关系。

我认为问题与Pet是一个抽象类有关。如果Dog类从Set legs继承Pet,那么为了将Leg实例持久保存到数据库,基础Leg表需要有一个外来的pet_id的关键**。由于Petabstract类,因此不会为其创建表,因此没有id列。因此,在依赖类Leg中不能创建外键。

Pet类设为具体类(将其移至grails-app/domain并删除abstract关键字),意味着将创建具有id字段的表。在Leg表中,可以创建一个pet_id列,Hibernate将使用该列来保存/检索Set legs

**(或关联实体表,如pet_legs,需要有外键)

然而,使Pet类具体化将导致Pet的所有子类存储到该表中,因此如果您希望每个子类都有自己的表,那么可以补充:

  static mapping = {
    tablePerHierarchy false
  }

Dog类,它将在数据库中创建PetDog等表。

答案 1 :(得分:0)

你遗漏了几件事:

  1. GORM不会为null
  2. 生成表关系
  3. static fields/methods are not inherited. They belong to the class, not to the object references
  4. 因此您必须将代码更改为以下之一:

    abstract

    abstract class Pet {
        Nose nose
    }
    
    class Dog extends Pet {
        static hasMany = [legs: Leg, friends: Friend]
    }
    

    是的,第二种方法有效,因为您可以通过另一个静态classe的静态成员初始化类的静态成员。