@SequenceGenerator с проблемой DerbyEmbedded

На самом деле я пытаюсь изучить JPA, и у меня возникли проблемы с @SequenceGenerator.
Я использую встроенную базу данных derby с EclipseLink и пытаюсь применить аннотацию SequenceGenerator к идентификатору объекта Person. .
Вот код, который я использую для этого:

    @Id
    @SequenceGenerator(name="Person_SEQ", allocationSize=5, initialValue=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="Person_SEQ")
    private int id;


теперь проблема в том, что всякий раз, когда я запускаю приложение "в первый раз" (это означает, что я удаляю ранее созданную базу данных и повторяю попытку), я получаю это исключение:

[EL Warning]: 2011-09-17 22:25:03.649--ServerSession(31484215)--Exception       [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: SEQUENCE 'PERSON_SEQ' does not exist.
Error Code: 30000
Call: VALUES(NEXT VALUE FOR Person_SEQ)
Query: ValueReadQuery(sql="VALUES(NEXT VALUE FOR Person_SEQ)")

Это нормально?
______________________________

Я проверил сгенерированный файл createDLL.jdbc и вот что он дает относительно таблицы Person:

 CREATE TABLE PERSON (ID INTEGER NOT NULL, FIRSTNAME VARCHAR(255), LASTNAME VARCHAR(255), NONSENSEFIELD VARCHAR(255),PRIMARY KEY (ID))
 CREATE SEQUENCE Person_SEQ INCREMENT BY 5 START WITH 5

что заставляет меня задаться вопросом, почему он начинается с 5 вместо 1?

______________ ________________ ______________

Я также выяснил, что при перезапуске приложения (на этот раз с той же базой данных) и вставке некоторых новых лиц идентификатор прыгает так далеко от аллокации. Чтобы было понятно, вот сценарий, через который я прошел:

  • я вставил 29 человек в первое выполнение, которое создало пул идентификаторов, начиная с 1 до 29.
  • во втором исполнении (после закрытия приложения и его перезапуска) я также вставил 29 человек, что создало пул идентификаторов, начиная с 71 (вместо 30!!) до 99

эта проблема из-за встроенного драйвера derby? или я что-то еще упускаю?


person George Casttrey    schedule 17.09.2011    source источник


Ответы (1)


Там ошибка, скорее всего, просто предупреждение, EclipseLink проверяет, существует ли последовательность, и, возможно, создает ее, когда это не так.

Начало с 5 используется, потому что при первом выделении последовательности она должна возвращать 5, а это означает, что JPA может использовать 1-5 из-за размера предварительного выделения 5.

Переход к 71, скорее всего, вызван тем, что Derby кэширует идентификаторы последовательностей на сервере. Возможно, вы также можете установить параметр кеша в DDL, если хотите, но не должно быть никаких проблем с дырами, обычно чем больше размер предварительного распределения, тем лучше. Просто убедитесь, что вы используете long для своего идентификатора, а не int.

person James    schedule 19.09.2011
comment
Приложение, которое я собираюсь разработать, не предназначено для использования одной и той же базы данных в течение длительного времени, вместо этого база данных будет создаваться заново каждый новый год, и, следовательно, идентификаторы не будут достигать очень высоких значений. Вы думаете, мне действительно нужно использовать длинный тип? ваш ответ - это то, что я ожидал! Спасибо - person George Casttrey; 19.09.2011