GORM映射视图

时间:2015-11-05 09:09:00

标签: grails gorm

我有一个名为Contact的域类,其中有多个hasMany关系,另一个域类EmployeeConcat的一部分。

Contact有一个表contact,Employee应该映射到一个如下所示的视图:

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 个答案:

答案 0 :(得分:1)

我认为您正在使用继承。由于Employee由数据库视图支持,该数据库视图选择Contact子集,因此Employee {{1} }。所以你有一个很好的继承候选人。

每子类表继承

您将Contact视图描述如下:

employee

使用table-per-subclass继承时,为子类生成的表包含以下列:

  1. ID(主键)
  2. 添加到子类的属性列(不在超类中),不包括关联的属性。
  3. 由于SELECT * FROM contact where employee=1 没有,也无法添加其他属性,因此视图应仅返回主键。

    Employee

    我有一个article,它将 table-per-hierarchy table-per-subclass 继承进行比较,并演示它在数据库级别的样子。

    加入表格

    在您的域类示例中,您描述了一个连接表,用于在SELECT id FROM contact where employee=1 Employee之间创建多对多关系。连接表应该有两列,只有两列:

    1. 外键( me 域类)
    2. 其他域类的外键。
    3. 因此,您的CostCenter表格应包含employee_cost_centeremployee_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

      也许这是一个错字,但如果你没有定义一个反向引用,那么 belongsTo 应该被简单地定义为类,如下所示:

      static belongsTo = [CostCenter ]
      

      我从未使用 belongsTo 这样,所以我不知道它在数据库中的样子。但请注意,如果你有一个反向引用,定义如下:

      static belongsTo = CostCenter
      

      然后,您的static belongsTo = [costCenter: CostCenter] 视图必须返回employee列。