2015-05-21 3 views
14

В модели домена моего приложения Grails 2.5.0 у меня есть два класса Income и Benefit, которые имеют одинаковые свойства. Я хотел бы сохранить их в отдельных таблицах базы данных, но переместить общие поля в базовый класс. Модель, которую я придумал это:Наследование в модели домена Grails вызывает дублирование внешних ключей

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

Это приводит следующие таблицы, которые будут созданы для отношений между Assessment и Benefit

enter image description here

таблицей, созданной для отношений между Assessment и Benefit (неудивительно) идентичны.

Вместо имеющий assessment_benefit таблицу соединения между assessment и benefit, я предпочел бы иметь assessment_id внешний ключ в benefit таблице, тем самым устраняя необходимость присоединиться к столу.

Как я могу изменить свою модель домена для достижения этой цели?

+0

Что используется версия Grails? Я использовал Grails 2.4.4 и использовал классы домена, предоставленные вами, а именно: оценка, доход, доход и источник дохода. Он не создал дополнительную таблицу соединений, как вы уже упоминали. И она добавила 'valu_id' в таблицы доходов, доходов и доходов. Поэтому было бы легко проверить, предоставили ли вы версию Grails, используемую вами для этих примеров. – Ramsharan

+0

Я использую Grails 2.5.0 –

+0

Работает ли это как показано в ответе? – dmahapatro

ответ

1

Как я могу изменить свою модель домена для достижения этой цели?

Move

static belongsTo = [assessment: Assessment] 

от абстрактного родителя IncomeSource ребенку Benefit как:

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

Вы также можете сохранить это соотношение в базовом классе и просто скопировать belongsTo к ребенку, а также.

Таблица соединений не будет создана для Assessment и Benefit в любом случае.

То же самое применимо для Income, если подобное поведение не требуется.

Применимо для Grails 2.5.0

Смежные вопросы