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

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

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

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

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

* Hibernate: вставить в org_myEntity (entitiyJID, entityname, id) значения (?, ?, ?) org.зимовать.утиль.JDBCExceptionReporter
Ошибка SQL: 20000, SQLState: 23505 орг.зимовать.утиль.JDBCExceptionReporter В оператор был прерван, потому что это вызвало бы дубликат ключа значение в ограничении unique или primary key или уникальном индексе по SQL120725164357680' определен 'ИМЯ_ТАБЛИЦЫ'. орг.зимовать.событие.защита.AbstractFlushingEventListener
Не удалось синхронизировать состояние базы данных с сеансом орг.зимовать.исключение.ConstraintViolationException: не могли*

кстати, я использую Hibernate 3.3.2.Джорджия, класс javax.persistance 2.0.0 и Derby 10.5.1 база данных

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

1 ответов


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

авто-либо столбец идентификатора, последовательность или таблица в зависимости от базовая БД.

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

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