Я на самом деле пытаюсь изучить 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?или я что-то упускаю?