我有一个名为Contact
的域类,其中有多个hasMany关系,另一个域类Employee
是Concat
的一部分。
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
?
答案 0 :(得分:1)
我认为您正在使用继承。由于Employee
由数据库视图支持,该数据库视图选择Contact
的子集,因此Employee
是 {{1} }。所以你有一个很好的继承候选人。
您将Contact
视图描述如下:
employee
使用table-per-subclass继承时,为子类生成的表包含以下列:
由于SELECT * FROM contact where employee=1
没有,也无法添加其他属性,因此视图应仅返回主键。
Employee
我有一个article,它将 table-per-hierarchy 与 table-per-subclass 继承进行比较,并演示它在数据库级别的样子。
在您的域类示例中,您描述了一个连接表,用于在SELECT id FROM contact where employee=1
和Employee
之间创建多对多关系。连接表应该有两列,只有两列:
因此,您的CostCenter
表格应包含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
也许这是一个错字,但如果你没有定义一个反向引用,那么 belongsTo 应该被简单地定义为类,如下所示:
static belongsTo = [CostCenter ]
我从未使用 belongsTo 这样,所以我不知道它在数据库中的样子。但请注意,如果你有一个反向引用,定义如下:
static belongsTo = CostCenter
然后,您的static belongsTo = [costCenter: CostCenter]
视图必须返回employee
列。