2017-02-01 2 views
1

Мне нужно иметь уникальный идентификатор по всем таблицам в моей базе данных, который начинается со смещения, скажем 1000. Идентификаторы ниже этого смещения зарезервированы для специальных записей, на которые ссылаются константы в Java-код. Другими словами, первая запись, которая сохраняется в любой таблице, я ожидаю иметь идентификатор 1000, следующий 1001 и т. Д.Hibernate игнорирует initialValue для генератора последовательности

Я следовал инструкциям в документации Hibernate и различным сообщениям, и это аннотации, которые я используя:

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE) 
@SequenceGenerator(name = "my_sequence", initialValue = 1000, allocationSize = 10) 
private long id; 

К сожалению, Hibernate полностью игнорирует параметр initialValue. Он генерирует следующий код:

create table hibernate_sequence (next_val bigint) 
insert into hibernate_sequence values (1) 

У меня также была попытка с помощью стратегии ТАБЛИЦА, которая также не работает. Идентификатор начинается с 1.

@Id 
@GeneratedValue(strategy = GenerationType.TABLE) 
@TableGenerator(name = "my_sequence", initialValue = 1000, allocationSize = 10) 
private long id; 

Кстати, это работает с провайдером EclipseLink JPA. Моя версия Hibernate - 5.2.7, и я просматриваю JPA API. Я использую MySQL.

Неужели кто-нибудь испытал эту проблему?

Заранее спасибо.

ответ

0

Я думаю, что вы пропустили некоторые атрибуты обоих стратегий:

Последовательность

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE) 
@SequenceGenerator(name = "my_sequence", sequenceName= "dbsequence" 
        initialValue = 1000, allocationSize = 10) 
private long id; 

Таблица

Id таблицы поколение должно иметь две колонки. Первый столбец представляет собой тип String, используемый для идентификации конкретной последовательности генератора. Это первичный ключ для всех генераторов в таблице. Второй столбец представляет собой целочисленный тип, который хранит фактическую последовательность символов, которая генерируется. Значение, сохраненное в этом столбце, является последним идентификатором, который был выделен в последовательности.

@Id 
@GeneratedValue(strategy = GenerationType.TABLE) 
@TableGenerator(name = "my_sequence" 
       , table = "id_gen" 
       , pkColumnName = "gen_name" 
       , valueColumnName = "gen_val" 
       , initialValue = 1000, allocationSize = 10) 
private long id; 

Стратегия таблицы, очевидно, более переносима, поэтому считайте, что когда вы сделаете выбор.

+0

Это ничего не меняет. Hibernate игнорирует параметры аннотации, такие как имя таблицы или начальное значение: «create table hibernate_sequences». В конце концов, эти параметры являются необязательными. – Wombat

1

Имя генератор должен быть включен в @GeneratedValue аннотации, такие как:

@GeneratedValue(strategy = GenerationType.TABLE, generator = "my_sequence")  
@TableGenerator(
    name = "my_sequence", 
    table = "id_gen", 
    pkColumnName = "gen_name", 
    valueColumnName = "gen_val", 
    initialValue = 1000, 
    allocationSize = 10)