Наследование в модели домена Grails вызывает дублирование внешних ключей

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

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 join между Assessment и Benefit, я бы предпочел иметь внешний ключ assessment_id в таблице Benefit, тем самым устраняя необходимость в таблице соединений.

Как я могу изменить мою модель домена, чтобы достичь этого?

Ответы

Ответ 1

Как я могу изменить мою модель домена, чтобы достичь этого?

Переместить

static belongsTo = [assessment: Assessment]

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

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

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

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

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

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