多对多和映射问题

时间:2011-01-17 18:19:26

标签: grails orm mapping many-to-many

这是我的第一个有多对多关系的项目,在阅读了一些ORM的grails之后,我决定让grails为我做这项工作,就像创建表格一样。实际上,我的协议是:

  • 1用户有多个群组
  • 1组属于用户,拥有许多用户(所有者除外)

以下是我的课程:

class User {  
    String name
    List groups

    static hasMany = [groups : Group]

    static mapping = {
        table 'users'
        version false
    }
}

class Group {   
    String name
    List members

    static belongsTo = User
    static hasMany = [members : User]

    static mapping = {
        table 'groups'
        version false
    }
}

之后,我从grails得到的是3张桌子。 用户表格没问题,但接下来的2不是我的预期。

table **groups** |  id  |  name
table **users_groups** |  group_id  |  user_id  |  members_idx  |  groups_idx

嗯,我想要的是这样的:

table **groups** |  id  |  name  |   user_id 
table **users_groups** |  group_id  |  members_idx  |  groups_idx

我不知道我是否做错了什么或者我该如何修复它,但无论如何......当我尝试做 user.addToGroups(new Group())时,我仍然遇到另一个问题/ em>。我的 users_groups 表复制了这个寄存器,一个是members_idx null,另一个是groups_idx的寄存器。

3 个答案:

答案 0 :(得分:1)

如何从组中删除belongsTo并离开hasMany:

class User {  
    String name
    List groups

    static hasMany = [groups : Group]

    static mapping = {
        table 'users'
        version false
    }
}

class Group {   
    String name
    List members

    static hasMany = [members : User]

    static mapping = {
        table 'groups'
        version false
    }
}

修改 我认为你必须创建一个实际上将加入组和用户的域类。 我想你应该试试这个:

    class User {  
        String name

        static hasMany = [groups : UsersGroups]

        static mapping = {
            table 'users'
            version false
        }
    }

class Group {   
    String name

    static hasMany = [members : UsersGroups]

    static mapping = {
        table 'groups'
        version false
    }
}

class UsersGroups {

   static belongsTo = [group: Group, user: User]
   static mapping = {
      version false
   }

}

它将创建另一个实际连接组和用户的表。

答案 1 :(得分:0)

如果更改belongsTo以使用Map语法,它将使用外键而不是连接表:

static belongsTo = [user: User]

并且您将user字段作为反向引用。

答案 2 :(得分:0)

之前我做过类似的问题,所以我觉得这可能有用:

class User {  
    String name
    hasMany = [groups : Group]

    static mapping = {
        table 'users'
        version false
    }
}

class Group {   
    String name

    static belongsTo = [owner : User]
    static hasMany = [members : User]

    static mapping = {
        table 'groups'
        version false
    }
}

关于user.addToGroups的问题,我认为您应该在首先创建群组时设置所有者。然后将其他用户添加到组中。