Hibernate Использование последовательности PostgreSQL не влияет на таблицу последовательности

StackOverflow https://stackoverflow.com/questions/4288740

Вопрос

Я настроил Hibernate для использования последовательности PostgreSQL (через аннотации) для генерации значений для первичного ключа я бы столбец следующим образом:

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
@Column(name="id", unique=true, nullable=false)
public int getId() {
    return this.id;
}

Что я вижу с этой конфигурацией, это то, что Hibernate уже назначает я бы Значения> 3000 на сохранении, тогда как запрос на использованной последовательности показывает следующее:

database=# select last_value from entity_id_seq;
last_value 
------------
     69

(1 ряд)

Вопросы:
Есть что-то не так или нет?
Следует гибернация синхронизацией с таблицей последовательности?
Если нет, где он хранит последний сгенерированный идентификатор?

Спасибо.

Это было полезно?

Решение

У меня такая же проблема. Это связано с распределением стратегий гиберната. Ты выбираешь Peaventype.se.segence., Hibernate использует стратегию HILO, которая выделяет идентификаторы в блоках 50 по умолчанию. Так что вы можете явно установить выделение Значение, как это:

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
@Column(name="id", unique=true, nullable=false)
public int getId() {
    return this.id;
}

Хотя я также слышал мнения, которые используют стратегию HILO с выделения = 1. не очень хорошая практика. Некоторые люди рекомендуют использовать Genertytype.auto. Вместо этого, когда вы должны иметь дело с управляемыми базами данных последовательностей

Обновлять: Я заканчиваю с выделением = 1, и все, кажется, работают, как я ожидаю сейчас. Мое приложение такое, что мне не очень нужны блоки IDS в любом случае, так Ymmv..

Другие советы

Не используйте GeneralType. Используйте для последовательности Postgres!

Это совершенно противоборбилие, но людшие люди полностью запутались на этом. Ты ДОЛЖЕН использовать GeneralType.auto. или гибернат будет сносать Ваши последовательности, если вы должны перезапустить / восстановить вашу БД. Он почти преступно небрежен, что они позволили бы этот код пойти в строительную сборку, но команда Hibernate довольно известна своими бычьими позициями в отношении категорически неправильных позиций (проверьте их позицию на левых присоединениях).

Во-первых, вы должны определить, какую версию Hibernate вы используете. С точки зрения версий Hibernate-Core, 3.2, введенные более последовательную поддержку генераторам ID, особенно в отношении определения в аннотациях. Видеть http://in.relation.to/bloggers/new323BibernateDiodififierGenerators для обсуждения.

Следующим 3.6 ввел настройку («hibernate.id.new_generator_mappings»), что делает генераторы, обсуждаемые в этом блоге, обрабатывается способ JPA-аннотации по умолчанию. Настройка является ложным по умолчанию, потому что Hibernate должен поддерживать обратную совместимость с более старыми версиями. Если вы хотите, чтобы новое поведение (которое полностью рекомендуется), то просто установите настройку в True.

Как обрабатывается GeneralType, зависит от того, какую версию вы используете, и у вас есть ли у вас «hibernate.inew_generator_mappings». Я предполагаю, что вы используете 3.6+ (так как что-то старше, ну, старое) и иметь «hibernate.ive.new_Generator_mappings», установленные на TRUE (поскольку это рекомендация для новых приложений):

  1. Generytype.auto -> рассматривается как поколение.
  2. PELECTIONTYPE .. ПОВЕРХНИЕ -> Карты на org.hibernate.id.enhanced.sexenceStyleGenerator Class, обсуждаемый в блоге
  3. PELECTIONTYPE.TABLE -> Карты на org.hibernate.id.enhance.tablegenerators класса обсуждается в блоге

В Postgres я бы сделал это:

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="\"entity_id_seq\"")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="\"pk_sequence\"")
@Column(name="\"id\"", unique=true)
private int id;

В основном с заглавными именами Hibernate необходимо пройти сбежать котировки, чтобы понять Postgres и найти таблицы, столбцы или имена последовательностей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top