Уникальное ограничение Grails GORM для списка BigDecimal - PullRequest
1 голос
/ 15 февраля 2011

У меня есть класс:

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 () имеет значение true!

Я хочусписок BigDecimal, который уникален для каждого экземпляра объекта Test

1 Ответ

1 голос
/ 15 февраля 2011

Это не так, как это работает. Если вы думаете о чем-то более простом, например «String username», проверка уникальности создает уникальный индекс в базе данных по этому столбцу. Таким образом, два пользователя не могут иметь одинаковое имя пользователя / логин / и т. Д.

Но вы просите, чтобы содержимое списка было уникальным. Ограничение (если оно имеет смысл) будет сравнивать два списка и гарантировать, что никакие два списка Test экземпляров values не будут одинаковыми. Например, [1, 3, 5] <-> [1, 3] будет в порядке, но [1, 3, 5] <-> [1, 3, 5] не удастся. Это было бы непрактично для реализации и не поддерживается. Это эквивалентно требованию, чтобы имя пользователя не повторяло буквы - «burt» будет в порядке, но «burtbeckwith» не получится.

Если вы хотите, чтобы в коллекции были уникальные элементы, просто измените их со Списка на Набор. Вам даже не нужно ограничение:

class Test {
   Set<BigDecimal> values
}
...