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