我上课了:
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对象的每个实例都是唯一的
答案 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
}