Grails多对多关系的动态查找器
我有两个域类,它们由多对多关系映射。我遵循了Grails文档的说明,但在处理这些域上的数据时仍然存在一些问题。以下是我的两个域类:Grails多对多关系的动态查找器,grails,many-to-many,dynamic-finders,Grails,Many To Many,Dynamic Finders,我有两个域类,它们由多对多关系映射。我遵循了Grails文档的说明,但在处理这些域上的数据时仍然存在一些问题。以下是我的两个域类: class User { String name int age String job static hasMany = [groups : Group] static belongsTo = [org : Organization] } class Group { String groupName Stri
class User {
String name
int age
String job
static hasMany = [groups : Group]
static belongsTo = [org : Organization]
}
class Group {
String groupName
String code
static hasMany = [members : User]
}
我的问题是:1.上述关系需要一个类hold belongs作为关系的“所有者”。在此上下文中,用户属于组,但我不知道如何将belongsTo放入用户类,因为Grails建议的标准语法是static belongsTo=[Group](只指定所有者类名),因此我无法:
-将其放入exist belongsTo,如下所示:静态belongsTo=[org:Organization,Group]
-或者像这样定义另一个belongsTo:static belongsTo=[Group]
static mapping = {
authors joinTable:[name:"mm_author_books", key:'mm_book_id' ]
}
}
类作者{
字符串名
静态hasMany=[书籍:书籍]
static mapping = {
books joinTable:[name:"mm_author_books", key:'mm_author_id']
}
}我的意思是,我们需要为每个类指定联接表的外键的名称吗
belongsTo
将创建另一个M:1关系(字段)-您可以告诉您的案例中是否有用户的“主组”。如果我只希望强制执行至少一个组,我会为User.groups
使用自定义验证器检查它是否为空
userId
”/“groupId
”不同,我相信是的findBy*()
方法在这里不起作用,您需要一个CriteriaBuilder,比如m2m关系很少有自己的一方,所以我总是觉得必须指定一方才能让GORM正常工作很奇怪。正因为如此,我才不会这样做。我将连接表创建为一个域。然后事情变得非常简单 然后,您只需要在用户和组类中创建getter。两个类中都没有用户或组。不需要将它们映射为hasMany/belongsTo,因为所要做的就是创建联接表,这是通过创建用户组域完成的
class User {
Set<Group> getGroups() {
UserGroup.findAllByUser(this).collect { it.group } as Set
}
}
class Group {
Set<User> getUsers() {
UserGroup.findAllByGroup(this).collect { it.user } as Set
}
}
你明白了。这就更清楚地说明了为什么这是一个好方法,以及其他一些提高性能的好技巧
class User {
Set<Group> getGroups() {
UserGroup.findAllByUser(this).collect { it.group } as Set
}
}
class Group {
Set<User> getUsers() {
UserGroup.findAllByGroup(this).collect { it.user } as Set
}
}
def userGroupInstance = UserGroup.findByUserAndGroup(userInstance, groupInstance)
def userGroups = UserGroup.findAllByUser(userInstance)
def userGroupInstance = UserGroup.get(userId, groupId)