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