последовательность оракула запуталась, и вставки терпели неудачу из-за этого? - PullRequest
0 голосов
/ 14 марта 2012

Я использую последовательность для сохранения экземпляра объекта домена в моей базе данных Oracle. У меня есть последовательность для каждой таблицы в базе данных. когда я использую функциональность сохранения, например, для пользователя или ресурса, он создает новый ресурс с первой попытки, но используется идентификатор 70? последовательность показывает правильное следующее число - 42, поскольку максимальный идентификатор в таблице - 41. Почему для вставки нового ресурса использовался идентификатор = 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 ]

1 голос
/ 14 марта 2012

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

1 голос
/ 14 марта 2012

, поскольку максимальный идентификатор в таблице составляет 41

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

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

select mysequence.currval from dual

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

0 голосов
/ 14 марта 2012

Я понял основную причину проблемы.Ранее я использовал SequencePerTableOracleDialect, я узнал об этом из одного из предыдущих постов Берта Беквита.Диалект создает новую последовательность для каждой таблицы при запуске приложения, аналогично классу домена, преобразованному в таблицу.Диалект также гарантирует, что каждая последовательность идентификаторов таблиц управляется только через ее последовательность, и общая последовательность не используется для всех вставок в базе данных (что является стратегией по умолчанию). Во время реструктуризации кода я удалил пользовательский диалект и использовалдиалект по умолчанию 10g.

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

Я вижу следующее число в поле следующего значения связанной последовательности таблиц, откуда я узнаю, что следующее val = 42 для resource_sequence, что верно, поскольку max (id) в таблице ресурсов равно 41.

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

0 голосов
/ 14 марта 2012

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

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