我有一个域类(让我们称之为安全性),它需要与另一个域类的三个“一对多”关系(让我们称之为角色)。这三种关系是“当前”,“前一个”和“新”。
基本上我希望做这样的事情(实际上它更复杂,但这可以用来说明事情):
class Security
{
static hasMany = [current: Role, previous: Role, new: Role]
Set current
Set previous
Set new
}
class Role
{
static belongsTo = [security: Security]
String name
}
不幸的是,这样的事情不起作用,因为Role域类只映射到一个表,并且一个表只有一列用于Security类的ID。
这可以不创建三个单独的Role类,而只是将一个类映射到多个表吗?
我也在考虑在Role类中简单地包含一个标志的可能性,以指示角色是当前的,先前的还是新的,并且在Security类中只有一个“一对多”的关系。但是,这种方法导致数据绑定问题,因为我的HTML表单需要为每个角色(名称属性和类型)发送两条信息。由于这些角色列在HTML select语句中,因此我只能发送一条信息(名称)。
答案 0 :(得分:1)
如果您不依赖于belongsTo
中的Role
(您必须将其删除),则可以使用joinTable
:
class Security {
static hasMany = [current: Role, previous: Role, next: Role]
static mapping = {
current joinTable: [name:'current']
previous joinTable: [name:'previous']
next joinTable: [name:'next']
}
}
答案 1 :(得分:0)
如果在角色中创建3个字段不是问题,您可以使用Grails mappedBy,如下所示:
class Security {
static hasMany = [current: Role, previous: Role, new: Role]
static mappedBy = [current: 'securityForCurrent',
previous: 'securityForPrevious', new: 'securityForNew']
}
class Role {
String name
Security securityForCurrent
Security securityForPrevious
Security securityForNew
}