2013-09-26 49 views
1

所以我试图让2个域从一个域继承。Grails域继承抽象类hasMany

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?

+0

您使用的是哪个版本的Grails,以及Pet类定义在哪里(例如src/groovy或grails-app/domain)? – dspies

+0

2.2。4和宠物在src/groovy中定义 –

回答

0

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

我认为这个问题与Pet是一个抽象类有关。如果Dog类从Pet继承Set legs,则为了将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类,这将在DB创建PetDog等表。

+0

我从来不希望'pet_id'字段用作外键,我只想让Pet的属性由'Dog'继承。 –

+0

对不起,我原来的答案可能有点神秘,所以我扩大了解释'pet_id'问题的含义。 – dspies

0

你错过了几件事情:

  1. 格姆不会产生一个abstract
  2. static fields/methods are not inherited. They belong to the class, not to the object references

所以,你必须将代码更改为一个表之间的关系如下:

abstract class Pet { 
    Nose nose 
} 

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

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

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

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