Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java EE (J2EE) и Spring > JPA: Автогенерация ID объекта? |
Автор: Andrey1 28.4.2008, 16:05 | ||||
Что нужно изменить/добавить, чтобы автогенерировались id для новых элементов при сохранении нового объекта object:
id в entity классе для object:
База - Оракл. |
Автор: Zamuta 28.4.2008, 16:30 | ||||
Andrey1,
Не знаю, что поддерживает оракл, но это должно работать.
|
Автор: Andrey1 28.4.2008, 16:55 | ||||||
Спасибо. Тоже думал, что это должно работать, однако - не работает... ![]()
Если заменить на @GeneratedValue(strategy=GenerationType.IDENTITY), то результат тот же, но ошибка другая:
Здесь http://java.sun.com/developer/technicalArticles/J2SE/Desktop/persistenceapi/ еще пишут, что можно писать аля:
, но разницы нет. |
Автор: medi 28.4.2008, 18:22 |
не знаю как TopLink, но в hibernate @GeneratedValue(strategy=GenerationType.IDENTITY) говорит о том, чтоб при генерации id использовать механизмы базы данных. Для этого испильзуется sequence, которые есть в базе для каждой таблици(с PrimaryKey (AUTO_GEN)) У тебя, TopLink запрашивает этото, но видемо не находит. Call: SELECT SEQ_GEN_SEQUENCE.NEXTVAL Проверь как называется имя sequence в базе, или может там вообще нету секуэнса для ID |
Автор: Andrey1 28.4.2008, 22:45 | ||
Я его ручками не вызывал... |
Автор: medi 28.4.2008, 22:58 |
Что ты ручками не вызывал? |
Автор: Andrey1 28.4.2008, 23:12 |
Запрос руками не писал. |
Автор: medi 28.4.2008, 23:20 |
я не говорю, что ты его писал, это делает O/R-mapper. У тебя в таблице поле OBJECT_ID как PrimaryKey? Добавлено через 2 минуты и 51 секунду я пишу "называется", а ты наверно вызывается прочитал? будь внимателен ![]() |
Автор: Ivan Kolesnikov 29.4.2008, 06:13 | ||
Фактически у нас имеется 3 метода получения id: TABLE, SEQUENCE, or IDENTITY и еще AUTO - который как я понимаю выбирает подходящую реализацию в зависимости от базы, в данном случае, судя по ошибке, была выбрана TABLE. Что конкретный метод обозначает: TABLE - должна быть таблица по умолчанию с именем SEQUENCE и двумя полями SEQ_COUNT и SEQ_NAME, соответственно следующее значение ID и идентификатор генератора (не помню какой значение), имя таблицы и имена полей можно настроить. Как я понимаю этот метод удобно использовать в СУБД в которых нет SEQUENCE. SEQUENCE - для генерацию используется SEQUENCE, в данном случае с именем SEQ_GEN_SEQUENCE, опять же имя можно настроить, как я понимаю для Oracle этот способ больше подходит, только нужно указать правильное имя SEQUENCE из которого брать этот ID. IDENTITY - данный метод на сколько я знаю не поддерживается в Oracle и используется вместо него SEQUENCE, суть его заключается в том, что некоторые СУБД например MySQL позволяют получить после выполнения запроса значения идентификатора установленного в поле id, типа кажется auto_increment. Что выбрать в данном случае. Если для генерации ID используется SEQUENCE, а так скорее всего и есть, то нужно выбирать этот метод, но тут есть один момент: часто id проставляется в триггере из сиквенса автоматом, в данном случае это приведет к ошибке, так как будет будет добавлена запись не с тем id что передали. Необходимо изменить триггер, чтобы если id уже заполнено, то не изменять его. Установить нужно имя сиквенса можно следующим образом
|
Автор: medi 29.4.2008, 06:27 |
Хорошая инфа, спасибо... |
Автор: Andrey1 29.4.2008, 10:32 |
Спасибо. Пришлось создать табличку SEQUENCE c столбцами: SEQ_COUNT, SEQ_NAME, и внести в нее: 1, SEQ_GEN. Странно, почему topLink не догадался это сделать, если она ему так нужна... |
Автор: Ivan Kolesnikov 29.4.2008, 13:34 | ||
Про topLink не знаю, с ним не работал, я использую реализацию hibernate, там можно через свойства указать нужно ли создавать или обновлять объекты, по умолчанию они не создаются. |
Автор: EJack 29.4.2008, 17:57 |
Можно посмотреть здест: http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing |