【问题标题】:Problems mapping Grails domain classes to joinTable将 Grails 域类映射到 joinTable 的问题
【发布时间】:2015-11-11 16:25:22
【问题描述】:

很难在 Grails 文档、GIA 书籍或 SO 中找到这个问题的答案。

我正在将 Grails 移植到旧数据库中。我有两个表,它们之间的关系在一个现有的外键连接表中。

根据我的阅读,您似乎可以使用 joinTable 参数指定 源表中的哪个字段在连接表中使用,但不能指定 外部的名称连接表中的键列。此数据库中的一个表遵循约定(Video 表有一个 id 列,在连接表中称为“video_id”;另一个表没有(PublisherCategory 表有一个 id 列,但在连接表中表示为“category_id”) 。”

当 Grails 启动时,它要么抱怨重复的“id”字段,要么抱怨连接表中不存在的字段。 (从文档中我不清楚 joinTable 中的 column 参数是否是该类中用作外键的列的名称,或者,如果它是外键的名称,因为它出现在joinTable。我一直在努力相信它是前者。)

我还尝试创建一个域类来表示连接表本身,两个源表都有 hasMany 关系,但 Grails 也不喜欢这样。 (它要求一个实体成为“所有者”,但将任一域设置为所有者都行不通。)

有什么建议吗?

【问题讨论】:

    标签: hibernate grails grails-orm jointable


    【解决方案1】:

    joinTable 中的 column 参数不是外键,而是一个值。对于many-to-many,您需要从两个方向设置映射。因此,使用这样的架构:

    视频 -|--------||--------|- PUBLISHER_CATEGORY

    可以像这样建模为领域类:

    class PublisherCategory {
        hasMany = [videos: Video]
        static belongsTo = Video
    
        static mapping = {
            videos joinTable: [
                name: 'the_join_table',
                key: 'category_id'
            ]
        }
    }
    
    class Video {
        static hasMany = [categories: PublisherCategory]
    
        static mapping = {
            categories joinTable: [
                name: 'the_join_table',
                key: 'video_id'
            ]
        }
    }
    

    【讨论】:

    • 非常有帮助,但仍然对“列”(根据 Grails 文档中的“倒数”)在这种情况下的含义感到困惑。
    • 好吧,引用您的一个选择,它是 ...出现在 joinTable 中的外键的名称。 它不是类。
    猜你喜欢
    • 2014-09-06
    • 2012-07-09
    • 2011-09-29
    • 1970-01-01
    • 2011-01-25
    • 2012-05-17
    • 2014-10-01
    • 1970-01-01
    • 2011-01-06
    相关资源
    最近更新 更多