2015-05-21 18 views
14

Nel modello di dominio della mia app Grails 2.5.0 ho due classi Income e Benefit con proprietà identiche. Vorrei memorizzarli in tabelle di database separate, ma spostare i campi comuni in una classe base. Il modello che è venuta in mente è:nel modello di dominio Grails causa chiavi esterne duplicate

class Assessment { 

    Date dateCreated = new Date() 
    User user 

    static hasMany = [incomes: Income, benefits: Benefit] 
} 

class Benefit extends IncomeSource {} 

class Income extends IncomeSource {} 

abstract class IncomeSource { 

    String name 
    BigDecimal amount 
    PaymentFrequency frequency 

    static belongsTo = [assessment: Assessment] 

    static mapping = { 
     tablePerHierarchy false 
    } 
} 

Questo fa sì che le seguenti tabelle da generare per il rapporto tra Assessment e Benefit

enter image description here

Le tabelle create per il rapporto tra Assessment e Benefit sono (non sorprendentemente) identici.

Invece di avere un assessment_benefit join tavolo tra assessment e benefit, preferirei avere una chiave esterna assessment_id nella tabella benefit, eliminando così la necessità per la tabella join.

Come posso modificare il modello di dominio per ottenere questo risultato?

+0

Qual è la versione Grails utilizzato? Ho utilizzato Grails 2.4.4 e ho utilizzato le classi di dominio fornite da voi, ovvero Valutazione, Benefit, Reddito e IncomeSource. Non ha creato una tabella di join aggiuntiva come hai menzionato. E ha aggiunto 'assessment_id' nelle tabelle benefit, income e income_source. Quindi sarebbe facile verificare se fornisci la versione di Grails da te utilizzata per questo esempio. – Ramsharan

+0

Sto usando Grails 2.5.0 –

+0

Funzionava come mostrato nella risposta? – dmahapatro

risposta

1

Come posso modificare il modello di dominio per ottenere ciò?

Spostare

static belongsTo = [assessment: Assessment] 

dal genitore astratta IncomeSource a figlio Benefit come:

class Benefit extends IncomeSource { 
    static belongsTo = [assessment: Assessment] 
} 

È possibile anche tenere questo rapporto nella classe base e basta copiare belongsTo a figlio pure.

Nessuna tabella join verrà creata per Assessment e Benefit in entrambi i casi.

Lo stesso sarebbe applicabile per Income, se è richiesto un comportamento simile.

Applicabile per Grails 2.5.0