@GeneratedValue со стратегией=GenerationType.AUTO генерирует повторяющееся значение после перезапуска

У меня есть объект гибернации с идентификатором, настроенным как

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

Создание новых элементов работает нормально при первом запуске. Но если я перезапущу свое приложение и верну записи, в следующий раз, когда я попытаюсь сохранить этот объект, спящий режим попытается использовать тот же идентификатор, сгенерированный, когда приложение не было перезапущено.

Я получаю сообщение об ошибке ниже, и при запуске с параметром трассировки я смог увидеть, что идентификатор используется повторно.

* Спящий режим: вставьте в org_myEntity (entitiyJID, entitityName, id) значения (?, ?, ?) org.hibernate.util.JDBCExceptionReporter
Ошибка SQL: 20000, SQLState: 23505 org.hibernate.util.JDBCExceptionReporter Оператор был прерван потому что это привело бы к дублированию значения ключа в ограничении уникальности или первичного ключа или индексе уникальности, идентифицированном "SQL120725164357680", определенном в "TABLE_NAME". org.hibernate.event.def.AbstractFlushingEventListener
Не удалось синхронизировать состояние базы данных с сеансом org.hibernate.exception.ConstraintViolationException: не удалось*

Кстати, я использую базу данных hibernate 3.3.2.GA, javax.persistance 2.0.0 и Derby 10.5.1.

Кто-нибудь знает, что может быть не так в моем поколении и как я могу это исправить?


person Thomas    schedule 25.07.2012    source источник


Ответы (1)


Если вы используете AUTO, Hibernate выберет одну из стратегий для создания вашего идентификатора. Из ссылки:

AUTO — столбец идентификаторов, последовательность или таблица в зависимости от базовой базы данных.

Таким образом, вы должны увидеть генерируемые идентификаторы, чтобы увидеть, какую стратегию использует Дерби. Хотя это выглядит так, он сбрасывает генератор каждый раз, когда вы перезапускаете приложение. Попробуйте установить

<prop key="hibernate.hbm2ddl.auto">update</prop>

Однако вы можете быстро исправить это с помощью генератора последовательностей. Нравится:

@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_seq_gen")
@SequenceGenerator(name="my_seq_gen", sequenceName="ENTITY_SEQ")
private Long id;

Где ENTITY_SEQ — это имя последовательности в вашей базе данных (вы создаете ее вручную).

person Tiago Farias    schedule 25.07.2012
comment
Это было немного сложнее, но ваше замечание к hibernate.hbm2ddl.auto дало сигнал. Наконец-то у меня был один файл свойств проекта с hibernate.hbm2ddl.auto, настроенным на создание-удаление, и SessionFactory одного из пакетов с hibernate.hbm2ddl.auto, настроенным на обновление. Таким образом, мои данные для этого пакета сохранялись в базе данных, но итераторы перезапускались. Обригадо пела дика =D - person Thomas; 26.07.2012