Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JPA: Автогенерация ID объекта? 
:(
    Опции темы
Andrey1
Дата 28.4.2008, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 2
Всего: 5



Что нужно изменить/добавить, чтобы автогенерировались id для новых элементов при сохранении нового объекта object:

Код

...
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("MyPU");
        em = factory.createEntityManager();

        em.getTransaction().begin();
        BigDecimal id = null;

            em.persist(object);
            em.getTransaction().commit();
            id = object.getObjectId();
...



id в entity классе для object:
 
Код

   @Id
    @Column(name = "OBJECT_ID", nullable = false)
    private BigDecimal objectId;


База - Оракл.

Это сообщение отредактировал(а) Andrey1 - 28.4.2008, 16:38


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
Zamuta
Дата 28.4.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 18.1.2006

Репутация: 4
Всего: 6



Andrey1
Цитата

Applications can choose one of four different id generation strategies by specifying a strat-
egy in the 
strategy element. The value may be any one of AUTO, TABLE, SEQUENCE, or IDENTITY 
enumerated values of the 
GenerationType enumerated type.
Table and sequence generators may be specifically defined and then reused by multiple 
entity classes. These generators are named and are globally accessible to all of the entities in 
the persistence unit.

Не знаю, что поддерживает оракл, но это должно работать. 
Код

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "OBJECT_ID", nullable = false)
    private BigDecimal objectId;



--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
Andrey1
Дата 28.4.2008, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 2
Всего: 5



Спасибо. Тоже думал, что это должно работать, однако - не работает...  smile 
Код

[TopLink Warning]: 2008.04.28 05:45:32.395--ClientSession(22736215)--Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-00942: table or view does not exist

Error Code: 942
Call: UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
        bind => [50, SEQ_GEN]
Query: DataModifyQuery()



Если заменить на @GeneratedValue(strategy=GenerationType.IDENTITY), то результат тот же, но ошибка другая:
Код


[TopLink Warning]: 2008.04.28 05:49:13.362--ClientSession(11228395)--Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-02289: sequence does not exist

Error Code: 2289
Call: SELECT SEQ_GEN_SEQUENCE.NEXTVAL FROM DUAL
Query: ValueReadQuery()



Здесь http://java.sun.com/developer/technicalArt...persistenceapi/ еще пишут, что можно писать аля:

Код

/**
     * Gets the id of this Player. The persistence provider should 
     * autogenerate a unique id for new player objects.
     * @return the id
     */
    @Id
    @GeneratedValue
    public Long getId() {
        return this.id;
    }

, но разницы нет.


Это сообщение отредактировал(а) Andrey1 - 28.4.2008, 17:35


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
medi
Дата 28.4.2008, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 1.4.2008
Где: Германия

Репутация: нет
Всего: нет



не знаю как TopLink, но в hibernate

@GeneratedValue(strategy=GenerationType.IDENTITY)

говорит о том, чтоб при генерации id использовать механизмы базы данных.
Для этого испильзуется sequence, которые есть в базе для каждой таблици(с PrimaryKey (AUTO_GEN))
 
У тебя, TopLink запрашивает этото, но видемо не находит. 
Call: SELECT SEQ_GEN_SEQUENCE.NEXTVAL

Проверь как называется имя sequence в базе, или может там вообще нету секуэнса для ID 
PM MAIL   Вверх
Andrey1
Дата 28.4.2008, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 2
Всего: 5



Цитата(medi @  28.4.2008,  18:22 Найти цитируемый пост)
Проверь как называется имя sequence в базе, или может там вообще нету секуэнса для ID

Я его ручками не вызывал... 


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
medi
Дата 28.4.2008, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 1.4.2008
Где: Германия

Репутация: нет
Всего: нет



Что ты ручками не вызывал?
PM MAIL   Вверх
Andrey1
Дата 28.4.2008, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 2
Всего: 5



Цитата(medi @  28.4.2008,  22:58 Найти цитируемый пост)
Что ты ручками не вызывал? 

Запрос руками не писал.


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
medi
Дата 28.4.2008, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 1.4.2008
Где: Германия

Репутация: нет
Всего: нет



я не говорю, что ты его писал, это делает O/R-mapper.
У тебя в таблице поле OBJECT_ID как PrimaryKey?

Добавлено через 2 минуты и 51 секунду
я пишу "называется", а ты наверно вызывается прочитал?
будь внимателен smile
PM MAIL   Вверх
Ivan Kolesnikov
Дата 29.4.2008, 06:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: 1
Всего: 6



Фактически у нас имеется 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 уже заполнено, то не изменять его.

Установить нужно имя сиквенса можно следующим образом
Код

@Id
@SequenceGenerator(name="seq_name", sequenceName="seq_name_in_db")
@GeneratedValue(generator="seq_name")
private Integer id;

--------------------
PM MAIL ICQ   Вверх
medi
Дата 29.4.2008, 06:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 1.4.2008
Где: Германия

Репутация: нет
Всего: нет



Хорошая инфа, спасибо...
PM MAIL   Вверх
Andrey1
Дата 29.4.2008, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 2
Всего: 5



Спасибо.

Пришлось создать табличку SEQUENCE c столбцами: SEQ_COUNT, SEQ_NAME, и внести в нее: 1, SEQ_GEN.

Странно, почему topLink не догадался это сделать, если она ему так нужна...


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
Ivan Kolesnikov
Дата 29.4.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: 1
Всего: 6



Цитата

Странно, почему topLink не догадался это сделать, если она ему так нужна... 

Про topLink не знаю, с ним не работал, я использую реализацию hibernate, там можно через свойства указать нужно ли создавать или обновлять объекты, по умолчанию они не создаются.
--------------------
PM MAIL ICQ   Вверх
EJack
Дата 29.4.2008, 17:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 4.9.2007

Репутация: нет
Всего: нет



Можно посмотреть здест:
http://en.wikibooks.org/wiki/Java_Persiste..._and_Sequencing
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0822 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.