уникальность составного идентификатора с нулевым компонентом - PullRequest
1 голос
/ 10 августа 2010

У меня проблемы с использованием уникальных ограничений. Допускаются следующие комбинации

A.name  B.name
foo     NULL
foo     bar
foo     bar1
foo1    bar

Не должно быть возможности создать новый A с тем же именем, только если он имеет другой B. С учетом приведенных ниже ограничений можно создать

A.name B.name
foo    NULL
foo    NULL

Потому что NULL, похоже, не влияет на уникальность.

Любые советы, как это исправить?

class A {
  String name
  static belongsTo = [b:B]
  static constraints = {
    name(unique:'b')
    b(nullable:true)
  }
}

class B {
  String name
  static hasMany = [as:A]
  name(unique:true)
}

Ответы [ 2 ]

1 голос
/ 11 августа 2010

Я не совсем уверен, но я думаю, что это будет работать:

name(unique:['b', 'name'])

Глядя на код для уникального ограничения, кажется возможным. Ограничение определенно позволяет вам передать список вещей для сравнения уникальности. Это называет это уникальность группы. Затем при проверке он перебирает этот список. Посмотрите, начиная со строки 137 здесь: http://www.docjar.com/html/api/org/codehaus/groovy/grails/orm/hibernate/validation/UniqueConstraint.java.html

Код выглядит так:

    if(shouldValidate) {
    Criteria criteria = session.createCriteria( constraintOwningClass )
        .add( Restrictions.eq( constraintPropertyName, propertyValue ) );
    if( uniquenessGroup != null ) {
        for( Iterator it = uniquenessGroup.iterator(); it.hasNext(); ) {
            String propertyName = (String) it.next();
            criteria.add(Restrictions.eq( propertyName,
                  GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(target, propertyName)));
        }
    }
    return criteria.list();
}

Таким образом, это зависит от того, вызовет ли вызов GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue свойство в том же классе. Который, исходя из названия, кажется, что должен.

Мне любопытно узнать, работает ли он для вас.

1 голос
/ 10 августа 2010

В структуре базы данных, не могли бы вы установить для столбцов значение NOT NULL DEFAULT 0 или аналогичное, а затем обращаться с нулями так же, как с NULL? Поскольку столбец предназначен для имен, вероятно, в значениях в любом случае не должно быть цифр, верно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...