域列表上的 Grails 唯一约束

Grails unique constraint on Domain list

如果我有一个域 Person 和一个 Domain Hobby,并且 Person hasMany Hobby,我如何才能确保相同的 Hobby 不会多次添加到 Person 集合中。

即像

`

   class Hobby {
      String name
      static belongsTo = [person: Person] 
   }
   class Person
      String name

      static hasMany =[hobby: Hobby]

      static constraints= {
        hobby.name unique: true           //like this
      }
   }   

这是自定义 validator 的完美用例。我建议阅读 documentation 以便您了解其中的可能性,但您可以使用如下内容:

class Hobby {
   String name
   static belongsTo = [person: Person]
}
class Person
   String name

   static hasMany = [hobby: Hobby]

   static constraints = {
      hobby validator: { val, obj ->
         if (obj.hobby.find{ (it.name.equals(val.name) && it.id != val.id) } ) return ['unique']
      }
   }
}

以上只是我的一些想法,可能会有拼写错误或逻辑错误,但它是一个示例,说明如何使用自定义 validator.

更新 Gregg 关于使 Hobby 每个 Person 唯一的答案实际上是解决此问题的一种更简单、更清晰的方法。正如他指出的那样,实际上不需要自定义验证器,因为 PersonHobby 之间存在关系。

文档 (http://docs.grails.org/2.5.5/guide/GORM.html#sets,ListsAndMaps) 说用 hasMany 定义的集合是 java.util.Set。并且 Set 不能包含重复项。

所以我认为您不必定义约束,默认情况下您有请求的行为。

我知道这个问题已经得到解答,但最简单的方法确实是这样做:

class Hobby {
  String name
  static belongsTo = [person: Person] 

  static constraints = {
    name unique: 'person'
  }
}

这将确保 hobby 对其父项 person 具有唯一的名称。无需自定义验证器。