2012-03-14 4 views
0

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

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

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

+1

Развернуть эту строку, «последовательность показывает правильное следующее число - 42, так как максимальное число в таблице равно 41». что заставляет тебя говорить это? – Marc

+0

, пожалуйста, проверьте мой ответ ниже .. Спасибо –

ответ

0

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

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

я вижу следующее число в таблицах, связанных следующее поле значения последовательности, в том, что, когда я пришел, чтобы узнать, что следующий вал = 42 для resource_sequence который является правильным, так как Макс (идентификатор) в таблице ресурсов является 41.

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

0

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

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

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

1

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

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

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

select mysequence.currval from dual 

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