Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate - Получение id перед insert


Автор: Praid 31.3.2012, 23:00
Как можно получить уникальный id для объекта перед его вствкой в базу данных используя Hibernate, Spring, MySQL?

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

Автор: Praid 1.4.2012, 12:16
Цитата(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 до того как будет вызванно сохранение изображения в базу.

Автор: Samotnik 1.4.2012, 12:48
Praid, а если после сохранения получать?
Сохраняешь картинку, получаешь id, затем сохраняешь html с id. 

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

Да, думаю что самый приемлемый вариант. Просто идея была в том чтобы сохранять все централизованно, что ли. В объекте News есть поле Set<Image>, тогда при сохранении News hibernate автоматически сохранял бы все. 
Так же рассматривал возможность собственной генерации уникального id (тэг <generator>), но ничего подходящего не обнаружил, кроме этого http://www.hibernate-training-guide.com/natural-keys.html, использование составного ключа не катит.
Пока буду пробовать твой вариант.

Автор: Samotnik 1.4.2012, 13:22
Praid, есть еще 2 варианта:
0. Если стоит стратегия генерация id как AUTO. То перед сохранением картинки ты можешь делать запрос в бд на максимальный id. Например вернется тебе 77, значит ты можешь быть уверенным, что следующий будет 78. Если многопоточность не перебьет. smile
1.Выбрать свою стратегию генерацию id. В этом случае сам всегда будешь управлять id

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

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

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

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

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

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

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


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

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

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

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


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

См. мой пост выше.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)