【问题标题】:Grails - Preventing a recursive one-to-many relationshipGrails - 防止递归的一对多关系
【发布时间】:2011-10-27 13:11:42
【问题描述】:

我在 Grails 中有以下域类:

class TreeNode {
    String name
    String description

    static hasMany = [childNodes: TreeNode]
}

确保 TreeNode 的实例不能将自己作为子节点的最惯用的 Grails 方法是什么?我可以将此作为域类中的约束,还是应该在 TreeNodeController 上的 Save 操作中编写自定义代码?

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

    将其作为自定义约束。

    static constraints = {
      childNodes(validator: {value, obj, errors->
          if(value.contains(obj) {
            errors.rejectValue('childNodes', 'Cannot contain self')
          }
      }
    }
    

    【讨论】:

      【解决方案2】:

      答案取决于您想在孩子身上检查的深度。如果您只担心直系子女,那么来自@Tiggerizzy 的代码应该可以正常工作。

      另一方面,如果您想验证节点不是树中的直接子节点或深层子节点,则应将逻辑从验证中提取出来并放在 Grails 服务类中。这将提供至少两个好处:

      1. 如果节点中的其他属性发生变化,但树的结构没有变化,您可以跳过子项检查验证,并在验证时为自己节省额外的处理时间。
      2. 如果您从树的附近或根部进行验证,那么验证所有子子项对于大树来说将是一个较长的过程,涉及大量的数据库工作。通过在 Service 类中完成这项工作,您可以获得 Service 的事务性质,这将回滚未处理的 Exception 上的任何数据库更改,例如在与另一个线程的乐观锁定情况下。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-27
        • 2020-04-08
        • 2015-03-02
        • 1970-01-01
        • 1970-01-01
        • 2017-01-07
        相关资源
        最近更新 更多