【问题标题】:GORM direct access to instance in a hasMany relationshipGORM 直接访问 hasMany 关系中的实例
【发布时间】:2016-04-01 03:10:46
【问题描述】:

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

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

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
    }
}

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

【问题讨论】:

    标签: grails grails-orm grails-domain-class


    【解决方案1】:

    我尝试了几种不同的方法,唯一能让它工作的方法是允许 root 暂时可以为空。没有这个我遇到的问题是由于订购 - 因为Directory 实例在hasMany 中,所以在保存CGroup 或save() 调用将失败,因为cgroup 为空(这是在调用addToDirectory 时设置的)。但是如果 CGroup 不可为空,则如果不设置 root 属性,则无法保存 CGroup。

    所以我将root 设为可空,但添加了一个自定义验证器,如果root 为空并且hasMany 中有任何实例,则验证失败:

    static constraints = {
       root nullable: true, validator: { Directory root, CGroup cgroup ->
          if (!root && cgroup.directory?.size()) {
             return ['root.required']
          }
       }
    }
    

    因此,您将使用任何必需的值保存 CGroup 实例,并且没有任何关联的 Directory 实例。然后使用addToDirectory 附加Directory 实例并使用自定义设置器设置root 实例:

    void setRoot(Directory root) {
       if (this.root) {
          removeFromDirectory this.root
       }
    
       if (root) {
          addToDirectory root
       }
    
       this.root = root
    }
    

    然后再次保存:

    def group = new CGroup(...).save()
    
    group.root = new Directory(...)
    group.addToDirectory(new Directory(...))
    group.addToDirectory(new Directory(...))
    group.save()
    
    g1.errors
    

    【讨论】:

    • 是的!这正是我一直在寻找的,您所说的订购问题正是我面临的问题,但我对自定义验证器不太熟悉。此外,我认为我可能遗漏了一些明显的东西,因为这似乎是一个相当普遍的情况。有一件事,在您的最后一段代码中,第二个 addToDirectory 实际上不应该是对 setRoot 的调用吗?干杯
    • 不,先设置root,然后再添加两个额外的实例,总共3个。那里的顺序无关紧要,只要你第二次调用save()时,root是set 并且该实例在 hasMany 中,可选地与一些其他实例一起。
    猜你喜欢
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多