2016-09-21 53 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的表。如果沒有類中的屬性連接到該列,這是不可能的,因此連接表是必需的。