Почему большинство приложений гибернации используют последовательность для генерации идентификаторов? - PullRequest
5 голосов
/ 15 апреля 2011

Почему большинство приложений hibernate используют последовательности для генерации идентификаторов?

Почему бы не использовать GenerationType = AUTO по умолчанию в аннотации @GeneratedValue?

P.S. В своей профессиональной карьере я вижу, что все используют последовательности, но я не понимаю, почему они затрудняются развертыванием решения (в инструкциях по развертыванию всегда есть команда create SQL).

Ответы [ 4 ]

5 голосов
/ 15 апреля 2011

Я вижу несколько причин:

  1. Наиболее часто используемая база данных в корпоративных приложениях - это, вероятно, Oracle, и у Oracle нет автоматически генерируемых идентификаторов, но есть последовательности.
  2. Последовательности позволяютимея идентификатор до вставки новой строки, а не после вставки новой строки.Это проще в использовании и эффективнее, поскольку вы можете выполнять пакетные операторы вставки в конце транзакции, но при этом идентификаторы определяются в середине транзакции.
  3. Последовательности позволяют использовать алгоритмы hilo (что по умолчанию используется длясоздание последовательности гибернации) и, таким образом, делает только один вызов БД для нескольких вставок, что повышает производительность.
  4. AUTO варьируется в зависимости от базы данных, тогда как последовательность всегда использует одну и ту же стратегию.
3 голосов
/ 15 апреля 2011

Из отличной книги Pro JPA 2 Овладение API персистентности Java Майка Кейта и Меррика Шинкарио.

Из главы 4: реляционное сопоставление объектов, раздел Генерация идентификатора.

[...] Если приложению все равно, что вид поколения используется поставщик, но хочет, чтобы поколение происходят, это может указать стратегию AUTO.

Есть хитрость в использовании AUTO, хоть. Поставщик получает, чтобы выбрать его собственная стратегия хранения идентификаторов, но это должно быть какое-то постоянный ресурс для того, чтобы сделать это. Например, если он выбирает основанная на таблице стратегия, она должна создать таблицу; если он выбирает основанная на последовательности стратегия, она должна создать последовательность. Поставщик не может всегда полагаться на соединение с базой данных что он получает от сервера в иметь разрешения на создание таблицы в база данных. Это обычно привилегированная операция, которая часто ограничено в DBA. Там нужно будет быть какой-то фазой создания или генерация схемы, чтобы вызвать ресурс, который будет создан до AUTO Стратегия способна функционировать.

Режим AUTO действительно поколение стратегия развития или макетирование. Это хорошо работает как средство чтобы заставить вас работать больше быстро, когда схема базы данных генерируется. В любом другом ситуации, было бы лучше использовать одна из стратегий другого поколения обсуждается в последующих разделах [...]

1 голос
/ 30 апреля 2011


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

На практике в последних версиях Hibernate (если не во всех) стратегия SEQUENCE фактически является HiLo на основе последовательностей, а не чистой последовательностью, как должны полагать люди.

Вы можете прочитать довольно подробный пост о стратегии генерации идентичности в моем блоге: здесь

Эяль

1 голос
/ 15 апреля 2011

По крайней мере, для Oracle: одна из причин заключается в возможности отслеживать количество объектов в таблице (для которой подходит специфическая для таблицы последовательность, если из таблицы не удаляются никакие объекты).При использовании GenerationType = AUTO используется глобальный порядковый номер, который приводит к появлению пробелов в номерах идентификаторов при наличии более одной таблицы в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...