Наследование в модели домена 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