这是我的第一个有多对多关系的项目,在阅读了一些ORM的grails之后,我决定让grails为我做这项工作,就像创建表格一样。实际上,我的协议是:
以下是我的课程:
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的寄存器。
答案 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
的问题,我认为您应该在首先创建群组时设置所有者。然后将其他用户添加到组中。