Как добавить новое автоматически сгенерированное поле первичного ключа в устаревшую таблицу с Grails? - PullRequest
0 голосов
/ 02 февраля 2012

У меня есть устаревшая таблица, которую я пытаюсь соединить с Grails. Я собираюсь упростить его модель, чтобы сделать вещи проще. В таблице 2 поля: «ИМЯ», которое имеет тип string, и «CPAR», которое имеет тип Integer и действует как идентификатор таблицы (первичный ключ).

То, что я хочу сделать, это сохранить «CPAR» для обратной совместимости и вставить в таблицу новое поле «ID», которое будет автоматически сгенерировано и фактически будет первичным ключом таблицы.

Вот мой класс домена:

Class Partners {

    Long id
    String name
    Integer cpar

    static mapping = {
        table "PARTNERS"
        version false

        columns {
            id column: "ID", generator: "sequence"
            name column: "NAME"
            cpar column: "CPAR"
        }
    }
}

Когда я запускаю это приложение, оно создает поле идентификатора в таблице, но все строки заполняются нулями (поле «ID» равно нулю, а не всей строке). При попытке получить доступ к приложению через его веб-интерфейс с поддержкой скаффолдинга выдает ошибку: не удается получить свойство id для нулевого объекта. Я хотел бы, чтобы эти поля «ID» заполнялись правильными значениями, а не нулями. Как я могу сделать это? База данных, которую я использую - Firebird.

1 Ответ

0 голосов
/ 02 февраля 2012

Я не знаком с Firebird, но я предполагаю, что он использует последовательности, похожие на Oracle и MySql. Первая проблема, которую я вижу, это объявление Long id. Hibernate предоставляет идентификатор для вас, поэтому вам не нужна эта строка кода. Далее вы можете указать последовательность, которую вы хотите использовать при определении столбца.

static mapping = {
    columns {
        id column: "ID", generator:'sequence', params:[name:'PARTNERS_ID_SEQ']
    }
}

Я никогда не использовал закрытие columns{}. Я всегда только что делал все свои сопоставления столбцов внутри закрытия mapping{}, поэтому я не уверен на 100%, что приведенный выше код будет работать. Если это не так, вы можете переместить генератор и имя за пределы columns{}, и оно должно работать:

static mapping = {
    columns {
        id column: "ID"
    }
    id generator:'sequence', params:[name:'PARTNERS_ID_SEQ']
}

В этой статье конкретно говорится о сопоставлении устаревших таблиц: http://dave -klein.blogspot.com / 2008/03 / Grails-ОРМ-DSL-rules.html

Это документ Grails по отображению идентификаторов, который на самом деле не говорит об имени последовательности: http://grails.org/doc/latest/ref/Database%20Mapping/id.html

...