#java #hibernate #exception #spring-mvc #db2
#java #спящий режим #исключение #spring-mvc #db2
Вопрос:
Я использую DB2 для своего приложения. Я запускаю некоторый скрипт вставки после создания базы данных. Этот скрипт вставки генерирует записи в таблице с идентификаторами, указанными в скрипте вставки.
Предположим, что для скрипта вставки таблицы abc создается запись с идентификатором = 3. Поскольку идентификаторы автоматически генерируются в режиме гибернации, поэтому при сохранении третьей записи из приложения я получил исключение.
Caused by: com.ibm.websphere.ce.cm.DuplicateKeyException: One or
more values in the INSERT statement, UPDATE statement, or foreign
key update caused by a DELETE statement are not valid
because the primary key, unique constraint or unique
index identified by "1" constrains table
Я использую @GeneratedValue(strategy = GenerationType.AUTO)
Что strategy = GenerationType
я должен использовать для решения этой проблемы.
Комментарии:
1. вы должны очистить базу данных после вставки этого правила
2. @SjB После вставки какого правила?
Ответ №1:
При использовании GenerationType возникают проблемы с некоторыми базами данных и гибернацией.ИДЕНТИФИКАТОР. Попробуйте использовать последовательность и явно настроить все для нее:
@Id
@SequenceGenerator(name = "DEPARTMENT_ID_GENERATOR", sequenceName="department_sequence", allocationSize=100)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "DEPARTMENT_ID_GENERATOR")
@Column(unique = true, nullable = false)
protected Long id;
Ответ №2:
Для DB2 @GeneratedValue(strategy = GenerationType.IDENTITY)
должно работать правильно.
Ответ №3:
Если идентификаторы указаны в файле, то вам вообще не нужно @GeneratedValue
, так как нет идентификатора для генерации. И обязательно очистите базу данных, как предложил @SjB.
Кроме того, не зная много о DB2, сообщение об ошибке предполагает, что может быть другое нарушение, чем просто дублирование идентификатора при вставке. Задействованы ли какие-либо внешние ключи?
Ответ №4:
Ничего не работает, кроме этого запроса.
alter table TABLE_NAME alter column ID set GENERATED BY DEFAULT RESTART WITH 10000;
DB2 должна сама выбрать доступный идентификатор, но не делает этого.