1

我正在尝试在 GORM/Grails 应用程序中映射现有表。大多数表都有复合主键(不是我的选择)。

我发现当我将关联映射到一个类(子类的父类)时,其中父类的复合键也包含与具有复合键的类的关联(祖父母),GORM 不会费心检查非复合键中祖父类和子类的映射。

孩子

class Child implements Serializable {
    Parent parent
    String name

    belongsTo= [parent: Parent]

    static mapping= {
        id(composite: ['parent', 'name'])
    }
}

家长

class Parent implements Serializable {
    GrandParent grandParent
    String name
    Collection<Child> children

    belongsTo= [grandParent: GrandParent]
    hasMany= [children: Child]

    static mapping= {
        id(composite: ['grandParent', 'name'])
    }
}

祖父母

class GrandParent implements Serializable {
    String name
    Integer luckyNumber
    Collection<Parent> parents

    hasMany= [parents: Parent]

    static mapping= {
        id(composite: ['name', 'luckyNumber'])
    }
}

尝试收集外键时,DDL 生成失败。

org.hibernate.MappingException:
Foreign key (FK_1:CHILD [parent_grandparent_id,parent_name]))
    must have same number of columns as the referenced primary key
(PARENT [parent_grandparent_name,parent_grandparent_lucky_number,parent_name])

它创建的外键与父类的主键不匹配(它能够正确破译)。

4

2 回答 2

0

尝试:

孩子

class Child implements Serializable {

    String name

    static belongsTo= [parent: Parent]

    static mapping= {
        id(composite: ['parent', 'name'])
    }
}

家长

class Parent implements Serializable {
    String name

    //static belongsTo= [parent: Parent]  //why do you need this
    static belongsTo= [GrandParent  ]  //did you mean this
    static hasMany= [children: Child,grandParent: GrandParent  ]

    static mapping= {
        id(composite: ['grandParent', 'name'])
    }
}

祖父母

class GrandParent implements Serializable {
    String name
    Integer luckyNumber

    static hasMany= [parents: Parent]

    static mapping= {
        id(composite: ['name', 'luckyNumber'])
    }
}
于 2016-02-23T12:58:46.930 回答
0

我在 Grails Slack #gorm 上四处询问过,这似乎触及了 Gorm 映射的空白。

我在 Grails 数据映射项目中提出了一个问题。我们会看看这是怎么回事。

于 2016-02-25T18:47:05.067 回答