Спящий режим: @GeneratedValue(стратегия = тип генерации

#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 должна сама выбрать доступный идентификатор, но не делает этого.