2013-08-05 115 views
8

爲了在映射單向OneToMany關係時實現外鍵列(無joinTable),我遵循Grails(版本2.2.3)參考文檔,section 6.5.2.1 OneToMany映射的步驟,其中指出Unidirectional OneToMany relationship without join表

使用單向關聯時,需要在關聯本身上指定外鍵。對於給定的(由許多替代)的人(一個替換)和地址之間的單向一對多關係例如下面的代碼將在許多表更改外鍵

class One { 

    static hasMany = [manyCollection:Many] 
    static mapping = { 
     manyCollection(column:"ONE_ID") 
    } 

} 

然而,當我運行

One one = new One() 
one.addToManyCollection(new Many()) 

one.save() 

我在控制檯中

insert 
into 
    one 
    (id, version) 
values 
    (null, ?) 

insert 
into 
    many 
    (id, version) 
values 
    (null, ?) 

insert 
into 
    one_many 
    (one_many_collection_id, many_id) 
values 
    (?, ?) 

通知Grails的CR請求一個名爲one_many的joinTable。所以,我的問題是:這是一個錯誤還是別的?我應該怎麼做才能擺脫joinTable?

即使當我使用類似

class One { 

    static hasMany = [manyCollection:Many] 
    static mapping = { 
     manyCollection(joinTable:false) 
    } 

} 

所強調here,我得到的結果相同

回答

10

你幾乎在那裏,你有兩個映射的一半,但你需要它的兩個正常工作。這不是一個很好的文檔記錄功能,但我以前使用過它,它絕對有效(例如沒有連接表)。所以在你的One類中,

class One { 
    .. 
    static mapping = { 
    manyCollection column: "ONE_ID", joinTable: false 
    } 
} 

注意:在進行映射更改時退出,清理和重新啓動grails可能是個好主意。當一個簡單的grails清理解決方案時,我已經損失了許多小時。

此外,您可以在技術上在很多類添加belongsTo沒有回參考,你仍然有一個真正的單向但級聯行動的好處(以一類映射),如果它是你需要的東西。

+0

參考文檔是錯誤的。 **我們應該使用joinTable:false **而不是列。如果我僅使用文檔所述的列,則將創建一個joinTable。 –

0

下面的設置將實現你說的是什麼:

class One { 
    static hasMany = [manyCollection: Many] 
} 

class Many { 
    static belongsTo = [one: One] 
} 

如果您想要刪除很多,如果它從收集中刪除,請添加:

class One { 
     static mapping = { 
      manyCollection cascade: 'all-delete-orphan' 
     } 
    } 
+0

您的解決方案是雙向關係,而不是單向關係 –