2010-05-14 4 views
2

J'ai deux domaines:Comment forcer les grails GORM à respecter le schéma 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' 
     } 
    } 

En fait, avec ces modèles, je reçois des tables:
- code_set,
- cartouche,
- et une table: code_set_cartridge (deux champs: code_set_cartridges_id, cartridge_id)

Je voudrais ne pas avoir code_set_cartridge table, mais gardez relation:
code_set -> 1: n -> cartouche

En d'autres termes, comment puis-je conserver l'association entre code_set et cartouche sans table intermédiaire? (en utilisant code_set_id comme clé primaire dans code_set et code_set_id comme clé étrangère dans la cartouche).

Le mappage avec GORM peut-il être effectué sans table intermédiaire?

Répondre

5

Cela fonctionne si vous modifiez la déclaration belongsTo. Plutôt que d'avoir juste une référence à l'identifiant de CodeSet, vous pouvez nommer l'instance dans l'belongsTo et vous obtiendrez la référence à l'instance et évitez la table de jointure. J'ai également supprimé les mappages redondants:

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

En utilisant le mode unidirectionnel, il n'y a pas de table intermédiaire également. Mais je suis confus avec le mode bidirectionnel et unidirectionnel. Dans ce cas, je devrais utiliser le mode bidirectionnel et unidirectionnel? Un exemple ? Merci –

+0

La décision se résume à si vous voulez avoir accès à l'ensemble mappé et la référence, ou juste la référence. Ma préférence est unidirectionnelle puisque vous pouvez toujours trouver les instances de CodeSet qui référencent une cartouche via "CodeSet.findAllByCartridge (this)" ou "CodeSet.findAllByCartridge (cartouche)". –

+0

Dans votre exemple, vous utilisez un mode unidirectionnel? Droite ? En utilisant "cartouche de cartouche" j'ai aussi un mode unidirectionnel. Quelle est la différence ? Le mode unidirectionnel et le mode bidirectionnel affectent-ils l'organisation de la table db? –

1

J'utilisais un mode un-à-plusieurs bidirectionnel, mais je peux aussi utiliser un mode unidirectionnel.

Donc, pour le domaine CODESET, le correctif est:

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' 
     } 
    } 

Mais, je confonds toujours avec le mode bidirectionnel et unidirectionnel?
Quelqu'un peut me montrer un bon exemple (pour m'aider à comprendre)? Merci

Questions connexes