2015-05-21 11 views
14

W modelu domeny mojej aplikacji Grails 2.5.0 mam dwie klasy Income i Benefit, które mają identyczne właściwości. Chciałbym przechowywać je w oddzielnych tabelach bazy danych, ale przenieść wspólne pola do klasy bazowej. Model mam wymyślić to:dziedziczenie w domenie Grails powoduje duplikaty kluczy obcych

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

Powoduje to poniższe tabele mają być generowane dla relacji między Assessment i Benefit

enter image description here

Tabele stworzone dla relacji między Assessment i Benefit są (nieoczekiwanie) identyczne.

Zamiast posiadające assessment_benefit dołączyć tabelę między assessment i benefit, wolałbym mieć assessment_id klucz obcy w tabeli benefit, eliminując w ten sposób potrzebę tabeli sprzężenia.

Jak mogę zmienić swój model domeny, aby to osiągnąć?

+0

Jaka jest wersja Grails używane? Użyłem Grails 2.4.4 i użyłem podanych przez ciebie klas domen, tj. Assessment, Benefit, Income i IncomeSource. Nie utworzyło dodatkowej tabeli dołączania, o czym wspomniałeś. I dodał "assessment_id" w tabelach benefit, income i income_source. Łatwo więc sprawdzić, czy podajesz wersję Grails, której używasz w tych przykładach. – Ramsharan

+0

Używam Grails 2.5.0 –

+0

Czy to działa jak pokazano w odpowiedzi? – dmahapatro

Odpowiedz

1

Jak mogę zmienić mój model domeny, aby to osiągnąć?

Move

static belongsTo = [assessment: Assessment] 

z abstrakcyjnego rodzica IncomeSource do dziecka Benefit jak:

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

Można również zachować ten związek w klasie bazowej i po prostu skopiować belongsTo do dziecka, jak również.

W obu przypadkach nie zostanie utworzona żadna tabela łączenia dla Assessment i Benefit.

To samo dotyczy Income, jeśli podobne zachowanie jest wymagane.

Dotyczy Grails 2.5.0

Powiązane problemy