继承抽象类的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
等表。您缺少一些内容:
抽象类生成表关系
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
}