In graal, posso implementare un N: 1 rapporto in questo modo:Quando deve essere usato Many per le relazioni N: 1 nelle classi di dominio Grails?
class Parent { hasMany = [children:Child] }
class Child { belongsTo = [parent:Parent] }
Ora (se addto e removeFrom è sempre usato correttamente) posso ottenere i figli di un genitore tramite parent.children.
Ma ho anche possibile farlo senza hasMany:
class Parent { }
class Child { belongsTo = [parent:Parent] }
allora devo usare Child.findAllByParent (genitore) per ottenere tutti i bambini.
La mia domanda: ci sono motivi importanti per cui dovrei usare hasMany se posso interrogare i figli di un genitore anche nel secondo modo?
Immagino che a volte sia più facile (e forse più veloce se impaziente insieme al genitore?) Di fare semplicemente riferimento a genitore.children, ma d'altra parte questo elenco può diventare piuttosto lungo quando ci sono diversi bambini. E ciò che non mi piace di ManyMany o è che devi sempre prenderti cura di addTo o removeFrom o cancellare la sessione dopo aver aggiunto un nuovo Child con un Parent così che grails lo faccia automaticamente ...
Is la risposta che dovresti semplicemente usare haMany se ci sono pochi bambini e non usarla se ce ne sono molti (per ragioni di prestazioni) o ce ne sono altri dietro?
Grazie, quindi è tutto sul comportamento a cascata. Diresti che le prestazioni non sono un problema quando l'elenco da gestire per i bambini diventa molto grande? Per quanto riguarda il tuo aggiornamento, sfortunatamente il salvataggio con flush: true non è sufficiente per addTo automatico/removeFrom. Come ho appreso nel mio problema con i grails inviati https://cvs.codehaus.org/browse/GRAILS-6356, è necessario cancellare la sessione con sessionFactory.currentSession.clear() se si desidera ottenere questo WITHIN da un test o da un controller . In una produzione scaffoldata, funziona perché la sessione viene cancellata dopo l'azione di salvataggio/aggiornamento di Child. –
Appena testato e sembra che la cancellazione a cascata sia l'opposto di ciò che si afferma all'inizio: Nel mio primo esempio (con hasMany), quando si elimina un genitore, vengono eliminati anche tutti i bambini. Nell'esempio SECONDO (senza hasMany), i bambini devono essere cancellati manualmente prima di eliminare un genitore. –
In realtà i miei test hanno anche rivelato che nel tuo esempio con hasMany e no appartiene, la cancellazione del genitore NON causa ai figli un genitore nullo ma lancia una DataIntegrityViolationException ... Devo impostare i genitori dei bambini a null prima della cancellazione . –