В чем преимущество использования `@ SequenceGenerator` по сравнению с автоинкрементом в базе данных? - PullRequest
0 голосов
/ 27 апреля 2018

Насколько я понимаю, если у нас есть @SequenceGenerator аннотация и имя последовательности, hibernate извлечет следующее значение для идентификатора, вызвав nextval(), а затем использует этот идентификатор при вставке новой записи.

Другой подход заключается в том, чтобы просто пометить столбец как автоинкремент в базе данных, и тогда Hibernate не должен будет этого делать. Например, с Postgres, в определении столбца запроса CREATE TABLE

id INTEGER PRIMARY KEY DEFAULT nextval('my_id_seq')

Каковы преимущества / недостатки каждого подхода? Существуют ли конкретные случаи, когда один метод предпочтительнее другого?

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Если у вашего столбца есть автоинкремент в базе данных, вы аннотируете этот столбец с @GeneratedValue в классе персистентных сущностей, который помогает автоматически увеличивать при сохранении в базе данных

@Entity
@Table(name="s3_dominant_person")
public class S3_Dominant_Person {
 @Id
 @GeneratedValue
 private Integer id;

вы должны AUTO_INCREMENT этот столбец тоже в таблице базы данных

's3_dominant_person', 'CREATE TABLE `s3_dominant_person` ( `id` int(11) 
NOT NULL AUTO_INCREMENT, 
0 голосов
/ 28 апреля 2018

с @SequenceGenerator:

  1. ваша база данных должна поддерживать последовательность !!! следовательно, если вы решили позже перейти от оракула к mysql -скажите- он не будет переносимым
  2. может быть, в некоторых случаях требуется придерживаться последовательности (архитектурное решение)
  3. последовательность позволяет allocationSize функцию, которая может повысить производительность
  4. вы можете использовать ту же последовательность для многих таблиц, что и генератор идентификаторов (это может быть также архитектурное решение / деловое требование)
  5. требует создания последовательности в базе данных ... это действие администратора базы данных, разрешено ли это в вашей среде?

с Auto increment

  1. у вас нет предыдущих плюсов / минусов
  2. прямой и легкий
  3. но у вас нет никакого контроля над сгенерированным идентификатором или способом генерации ... это может быть плохо с производительностью (выберите максимальный идентификатор, увеличить на единицу, обновить)

Обычно в производственной среде люди рекомендуют генератор таблиц как наиболее переносимое / контролируемое решение ... но это всегда зависит

0 голосов
/ 27 апреля 2018

Авто стратегия

ObjectDB поддерживает специальный генератор глобальных чисел для каждой базы данных.

Этот генератор чисел используется для генерации автоматических идентификаторов объектов для объектов сущностей, для которых не определены поля первичного ключа, и тот же генератор чисел также используется для генерации числовых значений для полей первичного ключа, аннотированных @ GeneratedValue с помощью стратегии AUTO:

@Id @GeneratedValue(strategy=GenerationType.AUTO) long id;

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

Стратегия последовательности

  1. Первое большое отличие состоит в том, что мы создаем отдельную последовательность, которая используется в выбранных объектах, а не в Global ObjectDB, где каждый объект со стратегией auto получает идентификатор.
  2. В стратегии последовательности идентификатор генерируется с автоматическим значением, как только новый объект сущности сохраняется (то есть до фиксации). Это может быть полезно, когда значение первичного ключа требуется раньше.

Мой источник и более подробно artcile ЗДЕСЬ

...