Проблема с последовательностью, почему два объекта совместно используют одну и ту же последовательность при генерации схемы с hbm2ddl? - PullRequest
3 голосов
/ 29 июля 2011

Я использую hbm2ddl в своем приложении на основе гибернации для создания схемы БД.Значение свойства hibernate.hbm2ddl.auto равно create-drop.

Я использую аннотации @Entity для своих классов POJO.

@Entity 
public class testTable1 {
     @Id     
     @GeneratedValue(strategy = GenerationType.SEQUENCE)
     Long id; 
}

@Entity 
public class testTable2 {
     @Id     
     @GeneratedValue(strategy = GenerationType.SEQUENCE)
     Long id; 
}

Однако при выполнении кода я продолжаю получать постоянно увеличивающиеся значения Id.например, для 2 таблиц Id (т.е. ключ Prim) должен начинаться с 1. Но после вставки записей в Table 1 последовательность переходит от следующего значения для Table 2.Это должно начаться снова с 1 для таблицы 2. Я попытался GenerationType.SEQUENCE & GenerationType.AUTO.ничего не работает: - (

Ответы [ 2 ]

6 голосов
/ 31 июля 2011

Вы используете глобальный генератор последовательностей, который в спящем режиме предоставляет по умолчанию, если не предоставлен генератор, как указано в спецификации JPA.Чтобы иметь частный генератор, вы должны объявить частный генератор с аннотацией @SequenceGenerator и установить атрибут generator аннотации @GeneratedValue

Извлечено из javadoc

@ GeneratedValue
(Необязательно) Имя генератора первичного ключа для использования, как указано в аннотации SequenceGenerator или TableGenerator.

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

SequenceGenerator
Эта аннотация определяет генератор первичного ключа, на который можно ссылаться по имени, если для аннотации GeneratedValue указан элемент генератора.Генератор последовательности может быть указан в классе сущности или в поле или свойстве первичного ключа.Область имени генератора является глобальной для единицы сохраняемости (для всех типов генераторов).

Пример:

@SequenceGenerator(name="EMP_SEQ", sequenceName="private_sequence")

Hibernate рекомендует, чтобы новые проекты использовали hibernate.id.new_generator_mappings = true, поскольку новые генераторы более эффективны и ближе кСемантическая спецификация JPA 2

Раздел 1.3.Свойства
2.2.3.Свойства идентификатора сопоставления

Полный пример

@Entity
@SequenceGenerator(name="PRIVATE_SEQ", sequenceName="private_sequence")
public class test {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="PRIVATE_SEQ")
    Long id;
}
0 голосов
/ 25 ноября 2016

В Hibernate 5.2 ,

Я попробовал ответ Джоэла Хадона, но не знаю, почему он не работает.

Я нашел несколько более коротких кодов длярешить.

3.2.Класс Java с аннотированной сущностью

@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = "increment")
public int id;

Может выдавать уникальный порядковый номер.

Надеюсь, это поможет.

...