Последовательность Oracle отпущена, а вставки не удалось из-за этого?

StackOverflow https://stackoverflow.com//questions/9694626

  •  13-12-2019
  •  | 
  •  

Вопрос

Я использую последовательность для сохранения экземпляра объекта домена в моей базе данных Oracle. У меня есть последовательность для каждой таблицы в базе данных. Когда я использую функциональность сохранения на пользователя или ресурсе, например, он создал новый ресурс сначала попытки, но ID используемый был 70?Последовательность показывает правильное следующее число - 42, поскольку MAX ID в таблице - 41. Почему ID= 70 используется для вставки нового ресурса?

Также от следующей попытки все вставки сбоя с этой ошибкой

org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; SQL [insert into GRARESOURCE (decomm
issioned, disabled, criticality, resourceClass, resourceGroupId, resourceName, ownerId, resourceSegmentId, resourceTypeId, riskSco
re, targetIP, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; constraint [GRA.SYS_C0012183]; nested exception is org.hibernate.e
xception.ConstraintViolationException: Could not execute JDBC batch update
.

Не уверен, что не так, потому что это происходит после реструктуризации кода ... где мы переместили код в новые пакеты ..

Редактировать: я обнаружил причину, увидим мой ответ .. спасибо, ребята,

Это было полезно?

Решение 4

Я понял основную причину проблемы. У меня ранее использовал последовательностьПеректируемые объекты, я получил это от одного из предыдущих постов Burt Beckwith. Диалект создает новую последовательность для каждой таблицы, когда приложение запускается, аналогично классу домена, преобразованного в таблицу. Диалект также гарантирует, что каждая последовательность идентификатора таблиц управляется только через ее последовательность, и для всех вкладышей в базе данных не используется общая последовательность (которая является стратегией по умолчанию) Во время реструктуризации кода я удалил пользовательский диалект и использовал диалект на 10 г по умолчанию.

Вот что вызывает проблему!

Я вижу следующий номер в поля следующего значения последовательности таблиц, что, где я узнаю, что следующий Val= 42 для Resource_sequence, который имеет право MAX (ID) в таблице ресурсов, составляет 41.

Спасибо многим, ребятам, для понимания, которая в некотором роде помогает мне вспомнить реальную причину! Для тех, кому нужно узнать больше о пользовательском диалекте, его Здесь

Другие советы

Последовательности

могут тратить номера, то есть всякая запись в таблице не обязательно будет одна после следующего без пробелов.Другими словами, тот факт, что ваши подскочки на 70, хотя предыдущая запись БД имела ID= 41, не указывает на проблему.

Поскольку max id в таблице 41

Последовательности

не видят максимального значения таблицы и получить следующий.Они хранят текущий последовательный номер, и вы будете использовать следующее значение.

Вы можете проверить фактический номер с:

select mysequence.currval from dual
.

Ваша проблема заключается в ограничении генеракодицетагкода.Посмотрите, что это проверяет, и если это ваш основной ключ, может быть, вы можете использовать более читаемое имя, например, my_table_pk ...

- SYS_C0012183 Ограничение первичного ключа?Определяется ли не просто столбец id (который есть, я предполагаю, столбец, заполняемый последовательностью)?

    .
  • Как вы определяете, что следующее значение последовательности 42?Вы запускаете отдельный запрос для этого?
  • Ожидаете, что последовательность даст вам бесплатные номера?Если это так, это проблема с вашими ожиданиями.Последовательности возвращают различные значения, но они не гарантируют, что не будет пробелов (на самом деле, вы можете гарантировать, что будут пробелы, потому что база данных выключается или последовательность была очищена от общего пула или транзакция была откатана назад.
  • Как вы используете последовательность?Есть ли триггер на столе?Или Hibernate сконфигурирован для использования последовательности?Если Hibernate настроен на использование последовательности, опубликовать эту конфигурацию.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top