hasMany映射表未创建

时间:2016-01-01 11:45:18

标签: grails gorm

我有GORM问题。

我尝试使用hasMany将一个域对象映射到另一个域。

class PrototypePriceModifierCode {
    ...
    static hasMany = [activitys:Activity]
    ...
}

由于我在课程Activity中不需要反向引用,因此我没有引用PrototypePriceModifierCode

只有这样才能按预期(1)创建我的映射表。

prototype_price_Modifier_code_id activity_id

Activity中,我需要对PrototypePriceModifier的引用,这与上述映射表无关。

问题是我定义

后不再生成映射表
class Activity{
...
    PrototypePriceModifierCode prototypePriceModifierCodeAttached

如何在我的Activity域类中创建引用PrototypePriceModifierCode的映射表?

3 个答案:

答案 0 :(得分:0)

试试这样:

class Activity {

    static belongsTo = [PrototypePriceModifierCode]
}

这样,activity表格中会有一列PrototypePriceModifierCode,而不是为hasMany创建单独的表格。

答案 1 :(得分:0)

Activity没有prototypePriceModifierCodeAttached属性时,hasMany中的PrototypePriceModifierCode会导致单向一对多关联。在数据库中,这是通过映射表实现的。

但是,当Activity具有prototypePriceModifierCodeAttached属性时,关联会更改为双向一对多。在数据库中,这意味着activity表具有指向它的外键prototype_price_modifierCode,因此不使用映射表。您可以详细了解这些差异here

" prototypePriceModifierCodeAttached"属性

如果你想要一个单向的一对多属性Activity.prototypePriceModifierCodeAttached,你可以创建一个查找PrototypePriceModifierCode的getter方法:

class Activity {

    PrototypePriceModifierCode getPrototypePriceModifierCodeAttached() {
        PrototypePriceModifierCode.where {
            activitys.id == this.id
        }.get()
    }

}

这里的缺点是GORM无法进入该物业;无法查询。

" price_modifier_code_id"柱

另一方面,如果您想要的是price_modifier_code_id表格中的activity列,则可以将其添加为long

class Activity {

    long prototypePriceModifierCodeAttached

    static mapping = {
        prototypePriceModifierCodeAttached column: 'price_modifier_code_id'
    }
}

这使得可以在属性上使用GORM查询,但仅限于PrototypePriceModifiedCode ID,而不是域类实例本身。

组合

只要您愿意进行一些维护,就可以结合使用这两种方法:

class Activity {

    long priceModifierCodeId // <--- You gotta maintain this property manually.

    PrototypePriceModifierCode getPrototypePriceModifierCodeAttached() {
        PrototypePriceModifierCode.get(priceModifierCodeId)
    }
}

注意:活动拼写错误。它应该是活动

答案 2 :(得分:0)

我最终使用String save逗号分隔的ID。

String activitys

this.activitys.split(',')each{
        p.activitys.add(Activity.get(Long.parseLong(it)))
}

由于我在这里不需要参考完整性,这对我来说很好。