2016-09-21 96 views
0

嗨,我有一个简单的问题。 我的领域类是这样的:Grails:简单有很多关系创建比必要的表更多的表

class Example { 

    long seq 

    hasMany = [example_array: ExampleData] 

    long count 
} 

class ExampleData { 

    String type 

    long description 

    static belongsTo = Example 

    static constraints = { 
    } 
} 

这导致3个表,就像一个多对多的关系。 这是为什么?

感谢

回答

0

我相信,你必须映射属于关联,就像这样:

static belongsTo = [example:Example] 

希望它能帮助:)

+0

不,您不必将'Map'分配给'belongsTo'。你可以分配一个Map或一个Class。如果你使用'Map',那么在定义'belongsTo'的类中添加一个返回引用。如果你使用'Class',那不会发生。请参阅http://docs.grails.org/3.1.11/ref/Domain%20Classes/belongsTo.html。 –

+0

如果你使用'Map',模式将会不同,这可能是你想要的,但是你不得不使用'Map'。 –

+0

好的,但他想摆脱第三张桌子,这将做到这一点。伯特贝克威斯用良好的话解释道。 –

0

从Grails中的hasMany的定义将默认情况下,地图这种与连接表的关系。这个连接表就是你提到的第3张表格,无需担心这一点。

0

one-to-many relationship由具有附加的表构造(即Example_ExampleData)含有形成的关系(即ExampleExampleData)实体的表两列每id字段。

新添加的表格是父表格的子项 - ExampleExampleData

因此,在您的情况下,当您运行应用程序时,默认情况下,第三个表由Grails创建,因为您的表关系属于one-to-many relationship

1

的原因额外的表是您建模只在一个方向的关系 - 一个Example可以通过了加,因为hasMany财产类的字节码的example_array设置访问其ExampleData实例,但一个ExampleData实例无法参考其拥有的Example

您添加了belongsTo属性,但只指定了类名。这足以配置所有权,级联删除等,但不提供该类中的属性来访问Example实例。

如果将其更改为其他支持的语法,这将作为你的预期:

static belongsTo = [example: Example] 

这里example最终会被一个Example属性的名称(你可以把它和/或example_array改变任何有效的属性名称),这是基本相同宣布

Example example 

现在,双方都可以访问其他的关​​系是双向的,你不再需要第三个表。这是因为一个1-many通常是在子表中使用外键实现的,在这种情况下,在ExampleData的表中指向Example的表。如果没有类中的属性连接到该列,这是不可能的,因此连接表是必需的。

相关问题