1

所以我试图让 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吗?

4

2 回答 2

0

我尝试复制问题,但没有得到,但生成的数据库模式缺少和InvalidPropertyException之间的 1:m 关系。 DogLeg

我相信这个问题与Pet作为一个抽象类有关。如果Dog类继承Set legsPet,那么为了将Leg实例持久化到数据库中,基础Leg表需要具有pet_id** 的外键。因为Pet是一个abstract类,所以没有为它创建表,因此没有id列。因此,不能在依赖类中创建外键,Leg.

使Pet类成为具体类(将其移至grails-app/domain并删除关键字)意味着将创建abstract一个带有字段的表。idLeg表中,pet_id可以/将创建一个列,Hibernate 将使用它来持久化/检索Set legs.

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

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

  static mapping = {
    tablePerHierarchy false
  }

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

于 2013-09-27T17:06:25.673 回答
0

你错过了几件事:

  1. GORM 不会为abstract类生成表关系
  2. static字段/方法不被继承。它们属于类,而不属于对象引用

因此,您必须将代码更改为以下之一:

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
}

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

于 2015-05-18T12:57:57.623 回答