继承抽象类的Grails域有许多

继承抽象类的Grails域有许多,grails,inheritance,abstract,grails-domain-class,Grails,Inheritance,Abstract,Grails Domain Class,所以我尝试让两个域从一个域继承 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 f

所以我尝试让两个域从一个域继承

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,我必须做些什么吗?

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

我相信这个问题与
Pet
是一个抽象类有关。如果
Dog
类从
Pet
继承
Set legs
,那么为了将
Leg
实例持久化到数据库,底层
Leg
表需要有一个外键
Pet\u id
**。由于
Pet
是一个
abstract
类,因此不会为其创建表,因此没有
id
列。因此,不能在依赖类
Leg
中创建外键

使
Pet
类成为具体类(将其移动到
grails app/domain
并删除
abstract
关键字),意味着将创建一个带有
id
字段的表。在
Leg
表中,可以/将创建一个
pet_id
列,Hibernate将使用该列来持久化/检索
设置legs

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

但是,将
Pet
类具体化将导致
Pet
的所有子类存储到该表中,因此如果希望每个子类都有自己的表,可以添加:

  static mapping = {
    tablePerHierarchy false
  }

Dog
类,该类将在数据库中创建一个
Pet
Dog
等表。

您缺少一些内容:

  • GORM不会为
    抽象类生成表关系
  • 因此,您必须将代码更改为以下代码之一:

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


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

    您使用的是什么版本的Grails,Pet类在哪里定义(例如src/groovy或Grails app/domain)?2.2.4和Pet在src/groove中定义。我从不希望使用
    Pet_id
    字段作为外键,我只是想让宠物的属性被狗继承。对不起,我最初的回答可能有点含糊不清,所以我进一步解释了我所说的宠物id问题。
    abstract class Pet {
        Nose nose
        static hasMany = [legs: Leg]
    }
    
    class Dog extends Pet {
        static hasMany = [friends: Friend] + Pet.hasMany
    }