что делает все немного разумнее.

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

@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)

Решение Вопроса

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

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

В новых версиях Hibernate вы можете установитьhibernate.id.new_generator_mappings=true в ваших свойствах Hibernate; видетьдокументы.

 Jay06 янв. 2011 г., 15:54
Спасибо @araqnid, установка allocSize в 1 работает, но мне любопытно, что этот подход не является "хорошей практикой".
 araqnid06 янв. 2011 г., 17:32
установка для параметра allocSize значение 1 является вырожденным случаем, благодаря которому генератор в стиле HiLo работает как генератор обычной последовательности. ОТО, это то, что вам нужно, так что используйте его. Глядя на код в Hibernate 3.5, размер выделения используется для выбора реализации Optimizer, поэтому теперь он обрабатывается изящно.
 Jay18 янв. 2011 г., 19:02
На мой взгляд, команда Hibernate должна переосмыслить свою реализацию этого; это сбивает с толку и излишне так. Установка allocSize в 1 - это именно то, что мне нужно, но мне интересно, не должно ли это быть по умолчанию для SEQUENCE на PostgreSQL.
 Craig Ringer26 мая 2014 г., 11:43
Лучше установитьhibernate.id.new_generator_mappings что делает все немного разумнее.

Ваш ответ на вопрос