【问题标题】:Grails GORM unique constraint on a List of BigDecimalGrails GORM 对 BigDecimal 列表的唯一约束
【发布时间】:2011-02-15 18:29:45
【问题描述】:

我有课:

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 对象的每个实例都是唯一的

【问题讨论】:

    标签: unit-testing grails grails-orm


    【解决方案1】:

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

    但您要求 List 的内容是唯一的。约束(如果有意义的话)将比较两个列表并确保没有两个 Test 实例的 values 列表是相同的。例如 [1, 3, 5] [1, 3] 可以,但 [1, 3, 5] [1, 3, 5] 会失败。这将是不切实际的实施并且不受支持。这相当于要求用户名不能重复一个字母——“burt”可以,但“burtbeckwith”会失败。

    如果您想在集合中拥有独特的元素,只需将其从 List 更改为 Set。你甚至不需要约束:

    class Test {
       Set<BigDecimal> values
    }
    

    【讨论】:

    • Burt,我希望对值的集合进行排序,这就是 Set 不起作用的原因。我想 SortedSet 将是解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多