Как зарезервировать набор идентификаторов первичного ключа для предварительной загрузки данных начальной загрузки - PullRequest
1 голос
/ 09 апреля 2010

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

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

Ответы [ 2 ]

1 голос
/ 09 апреля 2010

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

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

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

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

1 голос
/ 09 апреля 2010

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

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

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

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

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

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

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

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