Hibernate генерирует два разных идентификатора последовательности для вставки PostgreSQL - PullRequest
5 голосов
/ 06 января 2011

У меня есть объект, определенный с помощью сгенерированного последовательностью первичного ключа:

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

Я использую PostgreSQL, и этот ключ определен как последовательный. По данным PostgreSQL

select last_value from id_key_seq;

возвращает

1603.

Когда я делаю create () для сохранения экземпляра этой сущности, я вижу следующее в моих журналах (несвязанные вещи отредактированы):


05 15: 15: 26.948 org.hibernate.id.enhanced.SequenceStructure [DEBUG] - Получено значение последовательности: 1604

05 15: 15: 26.948 org.hibernate.event.def.AbstractSaveEventListener [DEBUG] - сгенерированный идентификатор: 1554, с использованием стратегии: org.hibernate.id.enhanced.SequenceStyleGenerator


Последующие операторы вставки SQL ссылаются на значение 1554, а не на то, что должно использовать, 1604 (на основе значения, возвращенного из SequenceStructure. Откуда Hibernate получил 1554 от?

Мне кажется, в Hibernate есть ошибка - SequenceStructure знает правильное следующее значение, но оно не используется. Есть идеи, как решить эту проблему?

К вашему сведению: мне известна эта страница, на которой написано, что нужно использовать GenerationType.AUTO , потому что "ребята из Hibernate полностью испортили это", но есть не так уж много, что не очень полезно заявление.

1 Ответ

6 голосов
/ 06 января 2011

Похоже, если вы используете GenerationType.SEQUENCE, вам нужно указать «значение приращения» 1, чтобы избежать использования последовательности в качестве начального значения Hi / Lo.

Первый ответ (полезный) к вопросу, который вы разместили, объясняется, что вам нужно указать «allocSize = 1» в аннотации @GeneratedValue.

В более новых выпусках Hibernate вы можете вместо этого установить hibernate.id.new_generator_mappings=true в свойствах Hibernate;см документы .

...