很难在Grails文档,GIA书籍或者SO中找到答案。
我正在将Grails移植到遗留数据库中。我有两个表,它们之间的关系是在现有的外键连接表中。
从我所看到的,似乎使用joinTable参数,您可以在连接表中指定源表中的哪个字段,而不是外部的名称连接表中的键列。此数据库中的一个表遵循约定(Video表具有id列,并且在连接表中称为“video_id”;另一个表不具有(PublisherCategory表具有id列,但在连接表中表示为“category_id” 。“
当Grails启动时,它会抱怨重复的“id”字段,或者联接表中不存在的字段。 (从文档中我不清楚joinTable中的列参数是否是该类中用作外键的列的名称,或者,如果它是因为它出现在外键中的外键的名称joinTable。我一直在相信它是前者。)
我还尝试创建一个域类来表示连接表本身,两个源表都有hasMany关系,但Grails也不喜欢这样。 (它要求一个实体是“所有者”,但是将所有域设置为所有者都不起作用。)
有什么建议吗?
答案 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'
]
}
}