Проблема с последовательностью, почему два объекта совместно используют одну и ту же последовательность при генерации схемы с hbm2ddl?
Я использую hbm2ddl
в моем приложении на основе Hibernate для создания схемы БД. Значение 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 таблиц идентификатор (т.е. ключ Prim) должен начинаться с 1. Но после вставки записей в Table 1
последовательность идет от следующего значения для Table 2
, Это должно начаться снова с 1 для таблицы 2. Я пытался GenerationType.SEQUENCE
& GenerationType.AUTO
, ничего не работает:-(
3 ответа
Вы используете глобальный генератор последовательностей, который в спящем режиме предоставляет по умолчанию, когда генератор не предоставляется, как указано в спецификации 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;
}
@Entity
public class MyEntity2 {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="myentity2_seq")
@SequenceGenerator(name = "myentity2_seq",sequenceName = "myentity2_seq_table")
private int id;
@Column(length = 100)
private String name;
//setters & getters ...
}
В базе данных будет создана таблица myentity2_seq_table для хранения идентификаторов. мы можем настроить создание таблицы, используя initialValue = 100,locationSize = 10 в SequenceGenerator.
В Hibernate 5.2
Я попробовал ответ Джоэла Хадона, но не знаю, почему он не работает.
Я нашел несколько более коротких кодов, чтобы решить это.
3.2. Класс Java с аннотированной сущностью
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = "increment")
public int id;
Это может выдать уникальный порядковый номер.
Надеюсь, поможет.