Grails - 映射和数据绑定同一域类的多个集合

时间:2014-08-01 20:50:45

标签: grails data-binding mapping gorm hibernate-mapping

我有一个域类(让我们称之为安全性),它需要与另一个域类的三个“一对多”关系(让我们称之为角色)。这三种关系是“当前”,“前一个”和“新”。

基本上我希望做这样的事情(实际上它更复杂,但这可以用来说明事情):

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语句中,因此我只能发送一条信息(名称)。

2 个答案:

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


    }