Grails 没有创建多个映射表

Grails 没有创建多个映射表,grails,gorm,Grails,Gorm,我有一个GORM问题 我尝试用hasMany将一个域对象映射到另一个域对象 class PrototypePriceModifierCode { ... static hasMany = [activitys:Activity] ... } 因为我不需要类活动中的反向引用,所以我没有对原型PriceModifierCode的任何引用 只有这样才能按预期创建映射表(1) 在活动中,我需要一个对原型价格修饰符的引用,它与上面的映射表无关 问题是,一旦我定义了映射表,就不再生

我有一个GORM问题

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

class PrototypePriceModifierCode {
    ...
    static hasMany = [activitys:Activity]
    ...
}
因为我不需要类
活动中的反向引用
,所以我没有对
原型PriceModifierCode的任何引用

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

活动
中,我需要一个对
原型价格修饰符
的引用,它与上面的映射表无关

问题是,一旦我定义了映射表,就不再生成映射表

class Activity{
...
    PrototypePriceModifierCode prototypePriceModifierCodeAttached
如何创建映射表并在活动域类中引用
PrototypePriceModifierCode

试着这样做:

class Activity {

    static belongsTo = [PrototypePriceModifierCode]
}

这样,当
活动
没有
PrototypePriceModifierCode附件
属性时,
活动
表中将有一列列用于
PrototypePriceModifierCode
而不是为
hasMany
创建单独的表,
PrototypePriceModifierCode
中的
hasMany
导致单向一对多关联。在数据库中,这是通过映射表实现的

class PrototypePriceModifierCode {
    ...
    static hasMany = [activitys:Activity]
    ...
}
但是,当
活动
具有
prototypePriceModifierCodeAttached
属性时,关联将更改为双向一对多。在数据库中,这意味着
activity
表有一个外键指向它的
prototype\u price\u modifierCode
,因此不使用映射表。您可以阅读更多关于这些差异的信息

“prototypePriceModifierCodeAttached”属性 如果需要单向一对多和属性
Activity.prototypePriceModifierCodeAttached
,可以创建一个getter方法来查找
PrototypePriceModifierCode

class Activity {

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

}
这里的缺点是GORM无法访问该地产;无法查询它

“价格\修改器\代码\ id”列 另一方面,如果您想要的是
活动
表中的
price\u modifier\u code\u id
列,则可以将其添加为
long

class Activity {

    long prototypePriceModifierCodeAttached

    static mapping = {
        prototypePriceModifierCodeAttached column: 'price_modifier_code_id'
    }
}
这使得可以对属性使用GORM查询,但只能对
PrototypePriceModifiedCode
ID使用GORM查询,而不能对域类实例本身使用GORM查询

组合 您可以将这两种方法结合起来,只要您愿意进行一些维护:

class Activity {

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

    PrototypePriceModifierCode getPrototypePriceModifierCodeAttached() {
        PrototypePriceModifierCode.get(priceModifierCodeId)
    }
}
课堂活动{

long priceModifierCodeId//我最终使用了字符串保存逗号分隔的ID

String activitys

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

因为我不需要引用完整性,这对我来说很好。

谢谢你的评论。问题是我需要两个:1)活动和PrototypePriceModifierCode之间的N:M映射的映射表,2)类活动中一个对一个特定PrototypePriceModifierCode的引用不,很遗憾,我没有映射表我想在数据库中实现以下目标:我需要3个数据库表:1)活动2)原型价格修改器代码3)1和2之间的映射(原型价格修改器代码id活动id)此外,我需要一个字段activity.price\u modifier\u code\u id。