嗨,我有一个简单的问题。 我的域类是这样的:
class Example {
long seq
hasMany = [example_array: ExampleData]
long count
}
class ExampleData {
String type
long description
static belongsTo = Example
static constraints = {
}
}
这导致3个表,就像多对多关系一样。 这是为什么?
由于
答案 0 :(得分:1)
额外表格的原因是您只在一个方向上建立了关系模式 - Example
可以通过添加到您班级的ExampleData
集合访问其example_array
个实例字节码由于hasMany
属性,但ExampleData
实例无法引用其拥有的Example
。
您添加了belongsTo
属性,但只指定了类名。这足以配置所有权,级联删除等,但不提供类中的属性来访问Example
实例。
如果您将其更改为其他支持的语法,它将按预期工作:
static belongsTo = [example: Example]
此处example
最终将成为Example
属性的名称(您可以将其更改为和/或example_array
为任何有效的属性名称),这基本上与声明
Example example
现在双方都可以访问另一方,这种关系是双向的,你不再需要第三个表。这是因为通常使用子表中的外键来实现1-many,在这种情况下,ExampleData
的表指向Example
的表。如果没有类中的属性连接到该列,那是不可能的,因此连接表是必要的。
答案 1 :(得分:0)
我相信你必须映射BelongsTo,就像这样:
static belongsTo = [example:Example]
希望有所帮助:)
答案 2 :(得分:0)
从hasMany Grails的定义来看,默认情况下会将这种关系映射到连接表。这个连接表是你提到的第3个表。不用担心。
答案 3 :(得分:0)
通过使附加表(即one-to-many relationship
)包含两列,每个Example_ExampleData
字段来自构成关系的实体的表(即id
和Example
来构建ExampleData
。 Example
)。
新添加的表是子表到父表 - ExampleData
和Grails
。
因此,在您运行应用程序的情况下,默认情况下,one-to-many relationship
会创建第3个表,因为您的表关系属于{{1}}。