Отображение GORM: сделать индекс уникальным

Сегодня я чувствую себя немного медленно. Я пытаюсь сделать что-то, что я считаю очень простым. У меня есть класс домена со свойством под названием «имя». Я хочу, чтобы «имя» имело индекс, и я хочу, чтобы индекс требовал, чтобы «имя» было уникальным. Я установил уникальное ограничение и попытался создать индекс. Я не могу понять из документов Gorm, как добавить уникальный атрибут в индекс. Вот код:

class Project {
    String name

    static hasMany = [things:Things]

    static mapping = {
        name index:'name_idx'
    }
    static constraints = {
        name(unique:true)
    }
}

Все хорошо с вышеизложенным, за исключением случаев, когда «показать индексы из проекта» в mysql, он показывает мой ключ имени как не уникальный. Я знаю, что проблема в том, что я не указываю уникальный в сопоставлении, но, честно говоря, документы для gorm вызывают у меня головную боль. Я вижу много всего о столбцах, но нигде в Интернете не могу найти ни одного примера, показывающего, что я хочу сделать. Мне не нужны сложные сопоставления или составные ключи, я просто хочу знать синтаксис для добавления уникального атрибута в объявление сопоставления выше. Приветствуются любые советы.

Я также сделал схему экспорта Grails и вижу следующее:

create index name_idx on project (name);

Ничто в том, что для указания этого индекса не требуются уникальные значения

Связанный дополнительный вопрос будет следующим: как только мне удастся сделать этот индекс уникальным, какой тип ошибки следует ожидать, когда я иду, чтобы сохранить экземпляр проекта, а имя не уникально? Выбрасывается ли конкретное исключение? Я понимаю, что даже если я проверю, что данное «имя» уникально, все еще существует вероятность того, что к тому времени, когда я его сохраню, может быть строка с этим именем.

Я совершенно уверен, что синтаксис для выполнения того, что я хочу, прост, но я просто не могу найти простой пример для обучения. Я был на этой странице, но она не объясняет КАК обеспечивается уникальность. Я хотел бы применить его на уровне индекса имен.


person Rich Sadowsky    schedule 03.04.2011    source источник


Ответы (2)


indexColumn позволяет настраивать дополнительные параметры. Это может быть то, что вы ищете.

static mapping = {
    name indexColumn:[name:'name_idx', unique:true]
}

Документация по Grails для indexColumn

person Derek Slife    schedule 03.04.2011
comment
Благодарю Дерека. Это действительно кажется правильным. Я предполагаю, что мое зависание было в том, что я не понимал, почему я не мог сделать это с более простым синтаксисом, но, в конце концов, это не так уж сильно отличается! Я проголосовал за это как за правильный ответ. Спасибо еще раз. - person Rich Sadowsky; 04.04.2011
comment
Рад, что это сработало для вашего Рича. Поскольку это был ваш собственный вопрос, вместо голосования вы должны принять ответ. :) - person Derek Slife; 05.04.2011

Если вы установите только ограничение unique, GORM отправит DDL для создания уникального индекса в базе данных.

static constraints = {
   name nullable: false, unique: true
} 
person heronsanches    schedule 20.04.2018
comment
И автоматически проверит это ограничение на шаге проверки (+1 запрос) - person stand alone; 08.01.2021