JPA / Hibernate / Derby TableGenerator использует отрицательные значения - PullRequest
2 голосов
/ 14 февраля 2011

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

Я определил TableGenerator:

 <table-generator name="MY_SEQ" table="MY_SEQUENCE_TABLE"
                    initial-value="-1000000" allocation-size="1" />

Я предполагал, что первый сгенерированный ключ будет начинаться с -1000000 иувеличивать каждый идентификатор на 1. Таким образом, следующий идентификатор будет -999999.

Когда я создаю и сохраняю новую сущность, я получаю следующую ошибку:

java.sql.SQLIntegrityConstraintViolationException: оператор былпрервано, потому что это вызвало бы дублирование значения ключа в ограничении уникального или первичного ключа ...

Когда я проверяю MY_SEQUENCE_TABLE, значение в SEQUENCE_NEXT_HIGH_VALUE равно 2. Я попытался определить генератор таблицы в ORM.xmlи в качестве аннотации, но поведение одинаково в обоих направлениях.

Можно ли использовать отрицательные значения для PK в Hibernate?

Спасибо

Обновление

Я делаю это, потому что я перемещаю данные из одной базы данных в другую.Затем я перемещаю данные обратно.За это время новые объекты могут быть созданы в другой базе данных (Derby).Когда я перемещаю объекты обратно, мне нужен способ узнать, были ли они созданы в этой базе данных, не меняя схему таблицы.Я подумал, что проверю идентификаторы на наличие отрицательных значений, и они, как я знаю, должны быть созданы как новые сущности при перемещении данных обратно.

Кто-нибудь знает, что класс Hibernate генерирует, обрабатывает TableGenerator и генерирует таблицукод последовательности?

Обновление 2

После некоторого тестирования кажется, что Hibernate игнорирует начальное значение и размер выделения при использовании генератора таблиц.

Я добавил это свойство в файл persistence.xml

<property name="hibernate.id.new_generator_mappings" value="true"/>

Я переключился на генератор последовательности, и начальное значение используется правильно, но размер выделения не сохраняется как отрицательный.Согласно спецификации Derby допустима отрицательная последовательность.

Из ссылки 10.6:

Если указано, значение INCREMENT является ненулевым числом, которое соответствует значению типа DataType.Если не указано, по умолчанию значение INCREMENT равно 1. INCREMENT - это шаг, на котором продвигается генератор последовательности.Если значение INCREMENT положительное, порядковые номера со временем увеличиваются.Если INCREMENT отрицателен, порядковые номера становятся меньше.

Выкл, чтобы попробовать больше вещей .....

1 Ответ

0 голосов
/ 14 февраля 2011

Я взглянул на спецификацию JPA , и, похоже, ничего не связано с ограничениями относительно начального значения, так что это, вероятно, зависит от реализации.Значение: вам не следует использовать отрицательные начальные значения, если вы хотите соответствия стандартам.

Вы пробовали установить allocation-size ="-1"?Я не могу попробовать это прямо сейчас, но мне любопытно, как ведет себя Hibernate, поскольку базы данных могут иметь отрицательные порядковые номера.

...