Как зарезервировать набор первичных идентификаторов ключей для предварительной загрузки данных Bootstrap
Вопрос
Мы хотели бы зарезервировать набор первичных идентификаторов ключей для всех таблиц (например, 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 (так что вам не нужно вызывать дБ для каждой новой таблицы).
Это то, что мы используем без особого.