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的靜態成員初始化類的靜態成員。