我有一个名为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
所以我可以将关系添加到Contact中,但是然后我在
CostCenter
Contact
中而不是Employee
中。如何添加关系到
Employee
?
最佳答案
我认为您正在使用继承。由于Employee
由选择Contact
的子集的数据库 View 支持,因此Employee
是Contact
。因此,您有一个很好的继承候选人。
每个子表的继承
您描述了employee
View ,如下所示:
SELECT * FROM contact where employee=1
使用每个子类的表继承时,为子类生成的表包含以下列:
由于
Employee
不会(也不能添加)其他属性,因此 View 应仅返回主键。SELECT id FROM contact where employee=1
我有一个article,它可以将每个层次结构的表与每个子类的继承进行比较,并在数据库级别演示它的外观。
联接表
在您的域类示例中,您描述了一个联接表,用于在
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
,因此:static belongsTo = [CostCenter ]
也许这是一个错字,但是如果您没有定义反向引用,则应当将belongsTo定义为简单的类,如下所示:
static belongsTo = CostCenter
我从来没有这样使用过belongsTo,所以我不知道它在数据库中是什么样子。但是请注意,如果您有一个反向引用,定义如下:
static belongsTo = [costCenter: CostCenter]
然后,您的
employee
View 必须返回cost_center
列。
关于grails - GORM映射 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33540398/