2010-05-14 9 views
2

我有兩個領域:如何強制grails GORM尊重DB方案?

class CodeSet { 

    String id 
    String owner 
    String comments 
    String geneRLF 
    String systemAPF 

    static hasMany = [cartridges:Cartridge] 

    static constraints = { 
     id(unique:true,blank:false) 
    } 

    static mapping = { 
     table 'code_set' 
     version false 
     columns { 
     id column:'code_set_id', generator: 'assigned' 
     owner column:'owner' 
     comments column:'comments' 
     geneRLF column:'gene_rlf' 
     systemAPF column:'system_apf' 
     } 
    } 

and : 

class Cartridge { 

    String id 
    String code_set_id 
    Date runDate 

    static belongsTo = CodeSet 

    static constraints = { 
     id(unique:true,blank:false) 
    } 

     static mapping = { 
     table 'cartridge' 
     version false 
     columns { 
     id column:'cartridge_id', generator: 'assigned' 
     code_set_id column:'code_set_id' 
     runDate column:'run_date' 
     } 
    } 

事實上,這些模型,我得到表:
- code_set,
- 墨盒,
- 和表:code_set_cartridge(兩個領域:code_set_cartridges_id,cartridge_id)

我想不會有code_set_cartridge表,但保持關係:
code_set - > 1:N - >盒

換句話說,如何在沒有中間表的情況下保持code_set和墨盒之間的關聯? (在code_set中使用code_set_id作爲主鍵,在cartridge中使用code_set_id作爲外鍵)。

與GORM的映射可以在沒有中間表的情況下完成?

回答

5

它適用,如果你改變belongsTo聲明。您不必僅僅引用CodeSet的id,而是可以在belongsTo中命名實例,並且您將獲得對實例的引用並避免連接表。我也刪除了多餘的映射:

class Cartridge { 

    String id 
    Date runDate 

    static belongsTo = [codeSet: CodeSet] 

    static mapping = { 
     version false 
     id generator: 'assigned' 
     codeSet column:'code_set_id' 
    } 
} 

class CodeSet { 

    String id 
    String owner 
    String comments 
    String geneRLF 
    String systemAPF 

    static hasMany = [cartridges:Cartridge] 

    static mapping = { 
     version false 
     id generator: 'assigned' 
     geneRLF column:'gene_rlf' 
     systemAPF column:'system_apf' 
    } 
} 
+0

通過使用單向模式,也沒有中間表。但我對雙向和單向模式感到困惑。在這種情況下,我應該使用雙向和單向模式?一個例子 ?謝謝 – 2010-05-14 21:13:56

+0

如果你想訪問映射集和引用,或者只是參考,那麼決定的真正目的就是歸結爲什麼。我的首選是單向的,因爲您始終可以通過「CodeSet.findAllByCartridge(this)」或「CodeSet.findAllByCartridge(cartridge)」找到引用Cartridge的CodeSet實例。 – 2010-05-14 21:17:25

+0

在你的例子中,你使用的是單向模式?對 ?通過使用「Cartridge cartridge」,我也有一種單向模式。有什麼不同 ?單向模式和雙向模式是否影響數據庫表組織? – 2010-05-14 21:35:53

1

我正在使用雙向一對多模式,但我也可以使用單向模式。

所以對於域代碼集,修復是:

class CodeSet { 

    String id 
    String owner 
    String comments 
    String geneRLF 
    String systemAPF 

    Cartridge cartridge 

    static constraints = { 
     id(unique:true,blank:false) 
    } 

    static mapping = { 
     table 'code_set' 
     version false 
     id column:'code_set_id', generator: 'assigned' 
     columns { 
     owner:'owner' 
     comments:'comments' 
     geneRLF:'gene_rlf' 
     systemAPF:'system_apf' 
     } 
    } 

但是,我仍然有雙向和單向模式混淆?
有人,可以給我一個很好的例子(幫助我理解)? 謝謝