2012-02-02 1 views
0

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

Что я хочу сделать, это сохранить «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.

ответ

0

Я не знаком с 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-orm-dsl-rules.html

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

Смежные вопросы