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

У меня есть спящий объект с идентификатором, настроенным как

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

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

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

*Hibernate: вставьте в значения org_myEntity (priviyJID, privityName, 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

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

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 - это имя последовательности в вашей базе данных (вы создаете ее вручную).

Другие вопросы по тегам