2013-08-05 13 views
8

Per realizzare una colonna chiave esterna (senza joinTable) quando la mappatura di un rapporto OneToMany unidirezionale, seguo le fasi secondo Grails (versione 2.2.3) documentazione di riferimento, section 6.5.2.1 mappatura OneToMany, che affermaunidirezionale OneToMany rapporto senza joinTable

Con associazioni unidirezionali è necessario specificare la chiave esterna sull'associazione stessa. Per esempio dato un rapporto OneToMany unidirezionale tra persona (sostituito da uno) e l'indirizzo (sostituito da molti), il seguente codice cambierà la chiave esterna nella tabella Molte

class One { 

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

} 

Tuttavia, quando ho eseguito

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

one.save() 

salgo in console

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 
    (?, ?) 

Avviso Grails cr mangia un joinTabella chiamata one_many. Quindi, la mia domanda: è un bug o qualcos'altro? Cosa devo fare per sbarazzarmi della tabella di join?

Anche quando uso qualcosa come

class One { 

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

} 

come evidenziato here, ho la stessa uscita

risposta

10

Sei quasi arrivato, hai 2 metà del mapping ma hai bisogno di entrambi per farlo funzionare correttamente. Non è una funzionalità ben documentata, ma l'ho già usata in passato e sicuramente funziona (ad es. Nessuna tabella di join). Quindi, nella classe One,

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

NOTA: è probabilmente una buona idea per uscire, pulito e riavviare graal quando si apportano modifiche di mappatura. Ho perso molte ore a battere la testa quando un semplice graal pulito era la soluzione.

Inoltre, si potrebbe tecnicamente aggiungere belongsTosenza il riferimento di nuovo nella Molti di classe e si avrebbe ancora una vera unidirezionale, ma con il vantaggio aggiunto di cascata azione (mappato in una classe) se si tratta di qualcosa che è necessario .

+0

La documentazione di riferimento è errata. ** Dovremmo usare joinTable: false ** invece di column. Se utilizzo solo la colonna come indicato dalla documentazione, verrà creato un joinTable. –

0

Le impostazioni seguenti attuare ciò che si sta parlando:

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

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

Se desidera eliminare i molti se viene rimosso dalla raccolta di quelli, aggiungere:

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

La soluzione è una relazione bidirezionale, NON unidirezionale –

Problemi correlati