将Grails域类映射到joinTable的问题

时间:2015-08-18 16:06:35

标签: hibernate grails gorm jointable

很难在Grails文档,GIA书籍或者SO中找到答案。

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

从我所看到的,似乎使用joinTable参数,您可以在连接表中指定源表中的哪个字段,而不是外部的名称连接表中的键列。此数据库中的一个表遵循约定(Video表具有id列,并且在连接表中称为“video_id”;另一个表不具有(PublisherCategory表具有id列,但在连接表中表示为“category_id” 。“

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

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

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

joinTable中的参数不是外键,它是一个值。对于many-to-many,您需要从两个方向设置映射。所以使用这样的模式:

视频 - | -------- |< (video_id)THE_JOIN_TABLE(category_id)> | -------- | - 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'
        ]
    }
}