@SequenceGenerator与DerbyEmbedded问题

时间:2011-09-17 22:08:13

标签: java jpa eclipselink derby

我实际上是在尝试学习JPA,而我在使用@SequenceGenerator时遇到了一些麻烦 我正在使用带EclipseLink的derby嵌入式数据库,我正在尝试将SequenceGenerator注释应用于Person实体的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 Table的内容:

 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的id的池

这是因为德比嵌入式驱动程序的问题吗?或者我错过了其他什么?

1 个答案:

答案 0 :(得分:2)

错误很可能只是一个警告,EclipseLink正在检查序列是否存在,并且可能在不存在时创建它。

使用5的开头是因为第一次序列被解除时它应该返回5,这意味着JPA可以使用1-5,因为预分配大小为5.

跳转到71很可能是由服务器上的Derby缓存序列ID引起的。如果您愿意,您也可以在DDL中设置缓存选项,但是不应该存在任何漏洞问题,通常预分配大小越大越好。只要确保你使用long来表示你的id,而不是int。