所以我试图让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吗?
答案 0 :(得分:0)
我尝试复制问题并且没有得到InvalidPropertyException
,但生成的数据库架构缺少Dog
和Leg
之间的1:m关系。
我认为问题与Pet
是一个抽象类有关。如果Dog
类从Set legs
继承Pet
,那么为了将Leg
实例持久保存到数据库,基础Leg
表需要有一个外来的pet_id
的关键**。由于Pet
是abstract
类,因此不会为其创建表,因此没有id
列。因此,在依赖类Leg
中不能创建外键。
将Pet
类设为具体类(将其移至grails-app/domain
并删除abstract
关键字),意味着将创建具有id
字段的表。在Leg
表中,可以创建一个pet_id
列,Hibernate将使用该列来保存/检索Set legs
。
**(或关联实体表,如pet_legs
,需要有外键)
然而,使Pet
类具体化将导致Pet
的所有子类存储到该表中,因此如果您希望每个子类都有自己的表,那么可以补充:
static mapping = {
tablePerHierarchy false
}
到Dog
类,它将在数据库中创建Pet
,Dog
等表。
答案 1 :(得分:0)
你遗漏了几件事:
null
类static
fields/methods are not inherited. They belong to the class, not to the object references 因此您必须将代码更改为以下之一:
abstract
或
abstract class Pet {
Nose nose
}
class Dog extends Pet {
static hasMany = [legs: Leg, friends: Friend]
}
是的,第二种方法有效,因为您可以通过另一个静态classe的静态成员初始化类的静态成员。