【发布时间】:2011-11-19 11:09:38
【问题描述】:
我实际上正在尝试学习 JPA,但我在使用 @SequenceGenerator 时遇到了一些问题。
我正在使用带有 EclipseLink 的 derby Embedded 数据库,并且我正在尝试将 SequenceGenerator 注释应用到 Person Entity 的 id。
这是我正在使用的代码:
@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 开头?
____________________________________________
我还发现,当重新启动应用程序(这次使用相同的数据库)并插入一些新人员时,id 会与 allocationSize 相差甚远。为了让我自己清楚,这是我经历过的场景:
- 我在第一次执行中插入了 29 个人,这创建了一个从 1 到 29 的 ID 池。
- 在第二次执行中(关闭应用程序并重新启动后)我还插入了 29 个人,这创建了一个从 71(而不是 30 !!)到 99李>
这个问题是由于 derby 嵌入式驱动程序造成的吗?还是我错过了什么?
【问题讨论】:
标签: java jpa eclipselink derby