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

Так что я мог бы добавить отношения к контакту, но затем я имею в CostCenterContact и не Employee,

Как я могу добавить отношения в Employee?

1 ответ

Я думаю, что вы на пути, используя наследование. поскольку Employee поддерживается представлением базы данных, которое выбирает подмножество Contactс Employee это Contact, Итак, у вас есть хороший кандидат на наследство.

Наследование таблиц на подклассы

Вы описали employee смотреть следующим образом:

SELECT * FROM contact where employee=1

При использовании наследования таблиц на подклассы таблица, созданная для подклассов, содержит следующие столбцы:

  1. ID (первичный ключ)
  2. Столбцы для свойств, добавленных в подкласс (не входят в суперкласс), исключая свойства для ассоциаций.

поскольку Employee не добавляет и не может добавлять дополнительные свойства, представление должно возвращать только первичный ключ.

SELECT id FROM contact where employee=1

У меня есть статья, которая сравнивает таблицу на иерархию с наследованием таблицы на подкласс и демонстрирует, как она выглядит на уровне базы данных.

Объединить столы

В примерах классов вашего домена вы описали таблицу соединений, чтобы создать отношение " многие ко многим" между Employee а также CostCenter, Объединяемые таблицы должны иметь два и только два столбца:

  1. Внешний ключ (класс домена me)
  2. Внешний ключ другого класса домена.

Так что ваши 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 колонка.

Другие вопросы по тегам