Grails GORM对BigDecimal列表的唯一约束

时间:2011-02-15 18:29:45

标签: unit-testing grails gorm

我上课了:

class Test {
    List<BigDecimal> values

    static constraints = {
    values(unique: true)
  }
}

然而,

void testUniqueness() {
  List valList = [
   new BigDecimal(1),
   new BigDecimal(1)
  ]
  def testInstance = new Test(values: valList)
  mockForConstraintsTests(Test, [testInstance])
  assertFalse "Validation should fail for non-unique values", testInstance.validate()
}

此断言失败,因为.validate()为真!

我想要一个BigDecimal列表,它对Test对象的每个实例都是唯一的

1 个答案:

答案 0 :(得分:1)

这不是它的工作原理。如果你想一些更简单的事情,例如“字符串用户名”,唯一性检查在该列的数据库中创建唯一索引。所以两个用户不能拥有相同的用户名/登录/等。

但是你要求List的内容是唯一的。约束(如果有意义)将比较两个列表并确保没有两个Test实例'values列表相同。例如[1,3,5]&lt; - &gt; [1,3]可以,但是[1,3,5]&lt; - &gt; [1,3,5]会失败。这实现起来是不切实际的,不受支持。这相当于要求用户名不要重复一个字母 - “burt”就可以了,但“burtbeckwith”会失败。

如果要在集合中包含唯一元素,只需将其从List更改为Set即可。你甚至不需要约束:

class Test {
   Set<BigDecimal> values
}