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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hibernate - Получение id перед insert, Получение id перед insert 
:(
    Опции темы
Praid
Дата 31.3.2012, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как можно получить уникальный id для объекта перед его вствкой в базу данных используя Hibernate, Spring, MySQL?
PM MAIL   Вверх
Samotnik
Дата 1.4.2012, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



для каких целей? Если просто вставлять данные с уникальным id, то подойдет традиционный AUTO_INCREMENT
PM MAIL   Вверх
Praid
Дата 1.4.2012, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Samotnik @  1.4.2012,  09:42 Найти цитируемый пост)
для каких целей? Если просто вставлять данные с уникальным id, то подойдет традиционный AUTO_INCREMENT 

Есть html и в нем нужно разместить ссылки на изображения, т.е нужно знать id этого изображения перед тем как оно будет добавлено в базу. Подробнее:
Есть три таблицы
   1) News (имеется поле content, которое содрежит html)
   2) News_Image
   3) Image
Все три таблицы связанны между собой, что отражено в hibernate mapping file. Так вот получается что нужно знать id для image до того как будет вызванно сохранение изображения в базу.

PM MAIL   Вверх
Samotnik
Дата 1.4.2012, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Praid, а если после сохранения получать?
Сохраняешь картинку, получаешь id, затем сохраняешь html с id. 
PM MAIL   Вверх
Praid
Дата 1.4.2012, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Samotnik @  1.4.2012,  12:48 Найти цитируемый пост)
а если после сохранения получать?
Сохраняешь картинку, получаешь id, затем сохраняешь html с id.  

Да, думаю что самый приемлемый вариант. Просто идея была в том чтобы сохранять все централизованно, что ли. В объекте News есть поле Set<Image>, тогда при сохранении News hibernate автоматически сохранял бы все. 
Так же рассматривал возможность собственной генерации уникального id (тэг <generator>), но ничего подходящего не обнаружил, кроме этого Hibernate - Natural Keys, использование составного ключа не катит.
Пока буду пробовать твой вариант.

Это сообщение отредактировал(а) Praid - 1.4.2012, 13:02
PM MAIL   Вверх
Samotnik
Дата 1.4.2012, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Praid, есть еще 2 варианта:
0. Если стоит стратегия генерация id как AUTO. То перед сохранением картинки ты можешь делать запрос в бд на максимальный id. Например вернется тебе 77, значит ты можешь быть уверенным, что следующий будет 78. Если многопоточность не перебьет. smile
1.Выбрать свою стратегию генерацию id. В этом случае сам всегда будешь управлять id
PM MAIL   Вверх
Stolzen
Дата 1.4.2012, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

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



Тут остается только сохранять объект сущности, а затем извлекать из него сгенерированный id.
Если по каким-то причинам необходимо получить уникальный идентификатор в момент создания сущности, воспользуйтесь UUID.

Цитата(Praid @  1.4.2012,  13:16 Найти цитируемый пост)
Все три таблицы связанны между собой, что отражено в hibernate mapping file. Так вот получается что нужно знать id для image до того как будет вызванно сохранение изображения в базу.

Не обязательно. Если связывать сущности каскадно (например, cascade = { CascadeType.ALL }), то хиб сам позаботиться о проставлении ссылок в момент сохранения сущности в сессию или после коммита транзакции. 


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Praid
Дата 1.4.2012, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Stolzen @  1.4.2012,  20:33 Найти цитируемый пост)
Тут остается только сохранять объект сущности, а затем извлекать из него сгенерированный id.

Это понятно, но в моем случае сложность обработки данных и проектирования существенно возрастает. Поэто очень желателен вариат с упреждающей (до сохранения объекта) генерацией id для сущности image.

Цитата(Stolzen @  1.4.2012,  20:33 Найти цитируемый пост)
воспользуйтесь UUID

Так он же строку генерит, id используется в качестве первичного ключа и как потом поиск производить? 
И какова вероятность того, что он не сгенерит уже существующий id  в базе данных?



Это сообщение отредактировал(а) Praid - 1.4.2012, 21:32
PM MAIL   Вверх
COVD
Дата 3.4.2012, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



Может, не надо Хибернет использовать? Хибернет для упрощения жизни придуман, но это не значит, что без него нельзя обойтись.

Идея получения id только после сохранения имеет смысл. Если данные успешно сохранились, то получите id. Это подтверждение того, что данные сохранены. Наоборот, если вы сгенерировали id, но еще не сохранили данные, то эта ситуация более сложная. Этот id пока ничему не соответствует.

Это сообщение отредактировал(а) COVD - 3.4.2012, 22:22
PM MAIL   Вверх
Praid
Дата 3.4.2012, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(COVD @  3.4.2012,  22:21 Найти цитируемый пост)
Может, не надо Хибернет использовать?

Еще как надо, проект большой и в 95% id получается традиционым способом.


Цитата(COVD @  3.4.2012,  22:21 Найти цитируемый пост)
Идея получения id только после сохранения имеет смысл.

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

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

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


 




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


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

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