我有以下域类:
class Metric {
String name
float value
static belongsTo = [Person,Corporation]
static indexes = {
name()
}
}
如何添加约束,以便Person,Corporation和name是唯一的?
感谢。
答案 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。
在上面的例子中,名称必须是个人和公司的唯一;人必须在名称和公司方面是独一无二的,最后公司必须在名称和人身上是唯一的。