2016-06-02 2 views
0

Я использую Generator для генерации первичных ключей для всех таблиц. Недавно я получил требование, которое мне нужно получить инкрементированным id программно, не сохраняя объект в базе данных. Я считаю, что это может быть достигнуто путем вызова внутреннего интерфейса hibernate. В любом случае знает, как получить инкрементированный id программно с помощью спящего режима?Hibernate программно увеличивается с увеличением ID

+0

http://stackoverflow.com/questions/11788483/hibernate-rundown-on-how-generatedvalue-works – ares

+0

Но это не объясняло на как получить идентификатор программно. – kenn3th

+0

Вам просто нужно добавить аннотацию '@ GeneratedValue' над полем идентификатора, а спящий режим будет автоматически выбирать наиболее подходящий способ генерации идентификаторов. – ares

ответ

0

Я смотрел код NHibernat (это, безусловно, работает для Hibernate). Вы можете вызвать генератор id, но это не поможет, потому что сгенерированный идентификатор не будет использоваться при хранении объекта.

Это то, что концептуально не работает. Вы не можете автоматически генерировать идентификаторы системы и генерировать их за пределами процедуры хранения одновременно.

Эти варианты, которые приходят на ум:

  • Использование ID генератора «назначен» и генерировать идентификаторы самостоятельно. Это единственный способ, которым вы можете назначить идентификатор, который был определен перед сохранением. (Обратите внимание, что нет тривиальной генерации уникальных чисел в системе параллельных транзакций.) Это не очень удобно для вашего кода, как вы увидите.
  • Вопрос требование. Как только объект идентифицируется с пользователем, не должно ли оно быть постоянным?
  • Рассмотрите возможность отделения видимого идентификатора от первичного ключа. Возможно, избыточный уровень должен иметь идентификаторы в системе, которые должны быть определены до другого, но в противном случае они отделяют ваши первичные ключи от пользовательских данных. Вы можете переключиться на другие генераторы ID по техническим причинам, не противоречив требованиям. (По аналогии с первым пунктом, но не баловаться с первичными ключами больше.)
  • не
+0

Мне нужно реализовать это, потому что мне нужно бегущее число, чтобы построить код, который позже будет храниться в базе данных. например. US-ABC-1000001, и я не хочу создавать порядковый номер для этого. – kenn3th

+1

Если вы хотите иметь его, как описано, вам необходимо либо назначить первичный ключ, либо выделить часть «US-ABC-1000001» из первичного ключа. В обоих случаях вам необходимо самостоятельно управлять порядковым номером. Вы, вероятно, можете (неправильно) использовать генераторы ID Hibernate для этого. Генераторы ID обычно не имеют большого количества кода, и вы также можете просто реализовать его самостоятельно. –

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