Как зарезервировать набор первичных идентификаторов ключей для предварительной загрузки данных Bootstrap

StackOverflow https://stackoverflow.com/questions/2606182

Вопрос

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

Все наши классы объекта JPA имеют следующее определение для первичного ключа.

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false, insertable = false, updatable = false)
private Integer id;

Есть ли способ сказать базу данных, что приращения должны начинаться с 1000 (т.е. данные конкретные клиенты начнутся с 1000 внутрь). Мы поддерживаем (h2, mysql, postgres) в нашей среде, и я предпочел бы решение, которое может быть привезено через JPA и инструменты Reverse Engineering DDL от Hibernate.

Дайте мне знать, если это правильный подход

Это было полезно?

Решение

Вы можете попробовать TABLE стратегия вместо IDENTITY. Отказ Из книги с гибернацией:

Очень похоже на гибернат hilo стратегия, TABLEПосетите на таблице базы данных, которая содержит последнее сгенерированное целое число первичного ключа, и каждый генератор отображается на одну строку в этой таблице. Каждая строка имеет два столбца: pkColumnNameа также valueColumnName. Отказ То pkColumnValue Назначает каждую строку к определенному генератору, и столбец VALE удерживает последний извлеченный первичный ключ. Поставщик настойчивых выделен до allocationSize целые числа в каждом ходу.

Вот пример с большим объяснением. И более сложный Пример для настройки начального значения.

Вы также можете попробовать использовать пользовательский генератор последовательности, определенный в вашем orm.xml, так:

<sequence-generator name="mySequenceGenerator"
  sequence-name="MY_SEQUENCE"
  initial-value="123"
  allocation-size="20"/>

Это заявляет, что последовательность базы данных имена MY_SEQUENCE С начальным значением 123 можно использовать в качестве источника для генерации идентификатора базы данных, и что механизм постоянства должен получать 20 значений каждый раз, когда он нуждается в идентификаторах. (Примечание, хотя, что аннотации с гибернацией, на момент написания, игнорирует initialValue параметр.)

Чтобы применить этот генератор идентификатора для определенного объекта, используйте его имя:

@Entity
class name MyEntity {
  @Id @GeneratedValue(generator = "mySequenceGenerator")
  String id;
}

Другие советы

Если все остальное не удается, вы всегда можете написать свой собственный пользовательский генератор идентификатора и использовать его в вашем дао create(Entity entity) метод. Таблица последовательности ID может быть что-то вроде

-------------------------------------------------------------
| sequence_name | initial_value | current_value | increment |
-------------------------------------------------------------
|           foo |          1001 |          2000 |       100 |

Это может означать, что идентификаторы для таблицы foo Начните с 1001 и увеличиваются на 100 (так что вам не нужно вызывать дБ для каждой новой таблицы).

Это то, что мы используем без особого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top