Возможно ли, чтобы домен Grails не имел идентификатора?

Можно ли создать таблицу без идентификатора? Например, это мой домен:

class SnbrActVector {

    int nid
    String term
    double weight

    static mapping = {
        version false
        id generator: 'identity'
    }

    static constraints = {
    }
}

Когда я запускаю этот оператор SQL, он терпит неудачу:

insert into snbr_act_vector values (5, 'term', 0.5)

Я проверил таблицу, и «id» уже настроен на автоинкремент. Я думаю, что еще один вариант - удалить сам «id». Или есть другой обходной путь для этого? Пожалуйста, предположим, что невозможно изменить данный оператор SQL.


person firnnauriel    schedule 06.04.2010    source источник


Ответы (5)


Для работы Gorm требуется поле id. Вы можете подделать назначенный идентификатор, используя переходную переменную, как показано ниже. Геттеры и сеттеры сопоставляют поле nid с полем id.

При сохранении объекта домена с помощью этого метода вы должны сделать:

snbrActVectgor.save(insert:true)

потому что Grails считает ненулевой идентификатор постоянным экземпляром.

class SnbrActVector {
    Integer id
    // nid is the actual primary key
    static transients = ['nid']
    void setNid(Integer nid) {
        id = nid
    }
    Integer getNid() {
        return nid
    }

    static mapping = {
        version false
        id generator:'assigned', column:'nid', type:'integer'
    }
}
person Lloyd Meinholz    schedule 06.04.2010

Вероятно, вам нужно указать, что nid — это ваш столбец id.

static mapping = {
    version false
    id generator: 'identity', column: 'nid'
}
person Luke Daley    schedule 06.04.2010
comment
похоже, это может быть другой подход. мне может понадобиться поиграть со свойством «генератор». еще раз обратите внимание, что основная цель - заставить этот оператор работать без каких-либо изменений: вставьте в snbr_act_vector значения (5, 'term', 0.5) - person firnnauriel; 06.04.2010
comment
Если это действительно ваша цель, вам может потребоваться дополнительная настройка в вашей БД. Возможно, триггер для перевода оператора в определение таблицы? В противном случае, я думаю, что ответ Люка близок к тому, что вы можете сделать с Grails/GORM. - person Matt Lachman; 06.04.2010

Невозможно не иметь «id». что вы можете сделать, это изменить имя поля «id», используя назначенный генератор идентификаторов.

person Viral Thakkar    schedule 06.03.2012

Попробуйте использовать: «id (генератор: «назначено»)» вместо «генератор идентификаторов:« личность »» и посмотрите, удаляет ли это свойство автоинкремента из столбца базы данных «id».

person dave    schedule 06.04.2010
comment
Спасибо за ответ. только что проверил ваше предложение и, к сожалению, «id» все еще там. - person firnnauriel; 06.04.2010
comment
Кстати, он удалил свойство автоинкремента «id». но мне нужно полностью удалить столбец «id» и иметь только 3 столбца: nid, term, weight - person firnnauriel; 06.04.2010

Да, в Oracle вы можете использовать ROWID для столбца ID.

class Document {
    String id

    static mapping = {
        table "DOCUMENTS"
        version false
        id column: 'ROWID'
    }

}
person Maciek Kreft    schedule 09.10.2015