2011-09-17 25 views
2

我实际上在试图学习JPA,而我在使用@SequenceGenerator时遇到了一些麻烦。
我在EclipseLink中使用了derby嵌入式数据库,我试图将SequenceGenerator注释应用到Person Entity的id。
下面是我使用的代码:@SequenceGenerator with DerbyEmbedded问题

@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至今跳跃。为了让我自己清楚这里是我所经过的场景:

  • 我已经插在第一次执行,这创造了从1开始ID池至29
  • 在第二次执行29人(关闭应用程序和重新发起之后)我也插入29人,其中创建的id从起始池(而不是30 !!)到99

是此问题由于嵌入德比驱动程序?还是我缺少别的东西?

回答

2

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

具有5开始的使用,因为在第一时间序列被alloacted它应该返回图5,这意味着JPA可以使用1-5,由于5.

跳转预分配大小的71最有可能是由服务器上的Derby缓存序列标识引起的。如果你愿意的话,你也可以在DDL中设置一个缓存选项,但是不应该有任何漏洞问题,通常预分配尺寸越大越好。只要确保你为自己的id使用long,而不是int。

+0

我即将开发的应用程序并不意味着长期使用相同的数据库,而是每个新的一年都会重新生成数据库,而且这些ID不会达到很高的水平价值观,你认为我真的需要使用长型?你的回答就是我期待的!谢谢 –