首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >GORM直接访问hasMany关系中的实例

GORM直接访问hasMany关系中的实例
EN

Stack Overflow用户
提问于 2016-04-01 03:10:46
回答 1查看 54关注 0票数 0

我有两个域类CGroup和Directory,我想建模一个包含许多目录的CGroup,但是其中一个目录被称为“根”,并且可以从CGroup直接访问。任何CGroup都应该只有一个根。,级联仍然可以工作,以至于删除任何目录都会删除它的所有子目录。

虽然我错了,但到目前为止,这就是我所拥有的:

代码语言:javascript
代码运行次数:0
运行
复制
class CGroup{
    ...
    Directory root

    static hasMany = [directory:Directory]

    static constraints = {
        root(unique:true)
    }
}

class Directory {

    static hasMany = [children:Directory]
    ...
    static belongsTo = [parent:Directory,
                        cgroup:CGroup]

    static constraints = {
        parent nullable: true
    }
}

基本上,我只需要引用存储在" one“端的”多“集合中的一个实例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-01 05:17:49

我尝试了几种不同的方法,唯一能让它工作的方法是允许root暂时为空。我没有这样做的问题是由于排序--因为Directory实例在hasMany中,所以在保存CGroup之前不能保存它们,或者因为cgroup为null (调用addToDirectory时设置),所以CGroup()调用将失败。但是,如果CGroup不能为空,则在不设置其root属性的情况下无法保存它。

因此,我使root为空,但添加了一个自定义验证器,如果root为null,并且hasMany中有任何实例,该验证程序就会失败。

代码语言:javascript
代码运行次数:0
运行
复制
static constraints = {
   root nullable: true, validator: { Directory root, CGroup cgroup ->
      if (!root && cgroup.directory?.size()) {
         return ['root.required']
      }
   }
}

因此,您将使用任何必需的值保存CGroup实例,而不使用任何关联的Directory实例。然后将Directory实例与addToDirectory连接起来,并使用自定义setter设置root实例:

代码语言:javascript
代码运行次数:0
运行
复制
void setRoot(Directory root) {
   if (this.root) {
      removeFromDirectory this.root
   }

   if (root) {
      addToDirectory root
   }

   this.root = root
}

再保存一次:

代码语言:javascript
代码运行次数:0
运行
复制
def group = new CGroup(...).save()

group.root = new Directory(...)
group.addToDirectory(new Directory(...))
group.addToDirectory(new Directory(...))
group.save()

g1.errors
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36347371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档