GORM Mapping View
У меня есть класс домена под названием Contact
с несколькими отношениями hasMany и другим классом домена Employee
которая является частью Concat
,
Contact
есть стол contact
и Employee должен быть сопоставлен с View, который выглядит следующим образом:
SELECT * FROM contact where employee=1
Employee
должны иметь те же столбцы и отношения, чем Contact
, как мне написать доменные классы? Могу ли я использовать наследование?
РЕДАКТИРОВАТЬ
Теперь я использовал наследование так:
class Employee extends Contact { }
class Contact{
static mapping = {
tablePerHierarchy(false)
}
}
Пока это работает, но теперь я хочу добавить некоторые Отношения к Employee
, как это:
class Employee extends Contact {
static belongsTo = [CostCenter ]
static hasMany = [costCenter: CostCenter]
static mapping = {
costCenter joinTable: 'employee_cost_center', column: 'employee_id'
}
}
class CostCenter {
static hasMany = [employees:Employee]
static mapping = {
employeesjoinTable: 'employee_cost_center', column: 'cost_center_id'
}
}
Теперь у меня есть проблема, что таблица employee_cost_center делает ссылку на Contact
это хорошо, но также добавил 'employee_id':
contact_id
employee_id
cost_center_id
Так что я мог бы добавить отношения к контакту, но затем я имею в CostCenter
Contact
и не Employee
,
Как я могу добавить отношения в Employee
?
1 ответ
Я думаю, что вы на пути, используя наследование. поскольку Employee
поддерживается представлением базы данных, которое выбирает подмножество Contact
с Employee
это Contact
, Итак, у вас есть хороший кандидат на наследство.
Наследование таблиц на подклассы
Вы описали employee
смотреть следующим образом:
SELECT * FROM contact where employee=1
При использовании наследования таблиц на подклассы таблица, созданная для подклассов, содержит следующие столбцы:
- ID (первичный ключ)
- Столбцы для свойств, добавленных в подкласс (не входят в суперкласс), исключая свойства для ассоциаций.
поскольку Employee
не добавляет и не может добавлять дополнительные свойства, представление должно возвращать только первичный ключ.
SELECT id FROM contact where employee=1
У меня есть статья, которая сравнивает таблицу на иерархию с наследованием таблицы на подкласс и демонстрирует, как она выглядит на уровне базы данных.
Объединить столы
В примерах классов вашего домена вы описали таблицу соединений, чтобы создать отношение " многие ко многим" между Employee
а также CostCenter
, Объединяемые таблицы должны иметь два и только два столбца:
- Внешний ключ (класс домена me)
- Внешний ключ другого класса домена.
Так что ваши employee_cost_center
таблица должна иметь столбцы employee_id
а также cost_center_id
, Если вам необходимо явно указать таблицу соединений, используйте key
вместо column
,
costCenter joinTable: 'employee_cost_center', key: 'employee_id'
employees joinTable: 'employee_cost_center', key: 'cost_center_id'
принадлежит
У тебя есть Employee
принадлежать CostCenter
как так:
static belongsTo = [CostCenter ]
Может быть, это опечатка, но если вы не определяете обратную ссылку, то отношение к объекту следует определять просто как класс, например:
static belongsTo = CostCenter
Я никогда не использовал принадлежность для этого, поэтому я не знаю, как это выглядит в базе данных. Но обратите внимание, что если у вас есть обратная ссылка, определенная так:
static belongsTo = [costCenter: CostCenter]
Тогда ваш employee
представление должно вернуть cost_center
колонка.