@SequenceGenerator с проблемой DerbyEmbedded - PullRequest
2 голосов
/ 18 сентября 2011

Я на самом деле пытаюсь изучить JPA, и у меня возникли некоторые проблемы с @SequenceGenerator.Я использую базу данных derby Embedded с 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 и вот что он дает в отношении таблицы персон:

 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?

__ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __

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

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

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

1 Ответ

2 голосов
/ 19 сентября 2011

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

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

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

...