GORM不处理在其复合主键中具有进一步关联的关联的映射

时间:2016-02-22 20:34:52

标签: grails gorm grails-3.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])

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

2 个答案:

答案 0 :(得分: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'])
    }
}

答案 1 :(得分:0)

我问过Grails Slack #gorm,这似乎在Gorm映射中遇到了一个空白。

我在Grails数据映射项目中raised an issue。我们会看到这一点。