域列表

时间:2016-12-01 13:02:20

标签: grails grails-domain-class

如果我有域名人员和域名爱好,而且有很多爱好,我怎样才能确保同一个爱好不会多次添加到人员收藏中。

即。

之类的东西

`

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

      static hasMany =[hobby: Hobby]

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

3 个答案:

答案 0 :(得分:5)

我知道这已经得到了回答,但最简单的方法就是这样做:

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

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

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

答案 1 :(得分:1)

这是自定义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之间存在关系。

答案 2 :(得分:0)

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

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