Grails的GORM约束问题

时间:2010-06-04 19:33:12

标签: grails constraints gorm

我有以下域类:

 class Metric {

   String name
   float value

   static belongsTo = [Person,Corporation]

   static indexes = {
    name()
 }
}

如何添加约束,以便Person,Corporation和name是唯一的?

感谢。

3 个答案:

答案 0 :(得分:2)

我认为这应该可行..将此添加到Metric。显然,如果你愿意,你可以忽略这些错误。

static constraints = {
        name(blank:false)
        corporation(nullable:false)
        person(nullable:false)

        name(unique:['corporation','person'])
    }

我使用此集成测试进行测试,似乎可以正常工作。

def newCorp = new Corporation(name:"Corporation1")
newCorp.save()
def newPerson = new Person(name:"Person1")
newPerson.save()

def newMetric = new Metric(name:"Metric1",corporation:newCorp,person:newPerson)
newMetric.save()

newMetric = new Metric(name:"Metric1",corporation:newCorp,person:newPerson)
newMetric.save()

assertTrue (Metric.list().size == 1)

答案 1 :(得分:0)

这是一个类似情况的链接,略有不同。但非常接近。如果你能做到这一点,可能会给你另一个好主意。

http://johnrellis.blogspot.com/2009/09/grails-constraints-across-relationships.html

答案 2 :(得分:0)

在我继续回答之前,我想告诫说,如果任何值都为null,那么使用Grails 1.2.x(可能还有1.3.x)时,复合唯一约束会被破坏。如果你不能没有独特的行为,你可以使用自定义验证来做到这一点。请参阅:https://cvs.codehaus.org/browse/GRAILS-5101

在名称,个人和公司中使用Metric域类的正确方法是unique

class Metric {

  String name
  float value
  Person person
  Corporation corporation

  static belongsTo = [person: Person, corporation: Corporation] 

  static indexes = {
    name()
   }

  static constraints = {
    name(unique:['person', 'corporation'])
    person(unique:['name', 'corporation'])
    corporation(unique:['name', 'person'])
  }
}

您需要将人员和公司称为模型成员。如果你不关心级联删除行为,你甚至可以删除静态belongsTo。

在上面的例子中,名称必须是个人和公司的唯一;人必须在名称和公司方面是独一无二的,最后公司必须在名称和人身上是唯一的。