【问题标题】:hasMany mapping table not createdhasMany 映射表未创建
【发布时间】:2016-01-01 11:45:18
【问题描述】:

我遇到了 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 的映射表?

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

    试试这样:

    class Activity {
    
        static belongsTo = [PrototypePriceModifierCode]
    }
    

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

    【讨论】:

    • 感谢您的评论。问题是我需要两个:1) Activity 和 PrototypePriceModifierCode 之间的 N:M 映射的映射表和 2) 一个对 Activity 类中一个特定 PrototypePriceModifierCode 的引用
    • 不,不幸的是!我没有映射表。
    • 那么我可能不清楚你的问题。你能详细说明一下吗
    • 让我这样试试。我想在数据库中实现以下内容:我需要有 3 个数据库表:1)活动 2)PrototypePriceModifierCode 3)1 和 2 之间的映射(prototype_price_Modifier_code_id activity_id)另外我需要一个字段 activity.price_modifier_code_id。
    【解决方案2】:

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

    但是,当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”列

    另一方面,如果您想要的是activity 表中的price_modifier_code_id 列,您可以将其添加为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)
        }
    }
    

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

    【讨论】:

      【解决方案3】:

      我最终使用字符串保存逗号分隔的 ID。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-07
        • 2012-04-03
        • 1970-01-01
        • 2012-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多