java - @SequenceGenerator 与 DerbyEmbedded 问题

标签 java jpa eclipselink derby

我实际上正在尝试学习 JPA,但我在使用@SequenceGenerator 时遇到了一些麻烦。
我将 derby 嵌入式数据库与 EclipseLink 一起使用,我正在尝试将 SequenceGenerator 注释应用于个人实体的 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 个人,这创建了一个 ID 池,从 71(而不是 30 !!)到 99<

这个问题是由于 derby 嵌入式驱动程序造成的吗?还是我错过了其他东西?

最佳答案

错误很可能只是一个警告,EclipseLink 正在检查序列是否存在,如果不存在则可能会创建它。

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

跳转到 71 很可能是服务器上的 Derby 缓存序列 ID 造成的。如果您愿意,您也可以在 DDL 中设置缓存选项,但是应该不会有任何空洞问题,通常预分配大小越大越好。只需确保您使用 long 作为您的 id,而不是 int。

关于java - @SequenceGenerator 与 DerbyEmbedded 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7458151/

相关文章:

java - 实体管理器中出现重复键错误,并保留正确的对象

java - 使用java发现在不使用itext的情况下将页码添加到pdf中的困难

java - 适当使用事件监听器模式

orm - J2SE 桌面应用程序 - JPA 数据库与集合?

java - 如何在 JPA 中注释这个复杂的连接?

java - 我可以使用 JPA 通过查询语言更新表的多列吗

java - 一起使用 cipherInputStream 和 FileInputStream 进行未加密和加密访问

java - 如何轻松地将字符串压缩到字节数组或从字节数组解压缩?

java - Eclipselink 进入错误的数据库平台

java - JAXB/Moxy 将 XmlElements 与 XmlAdapter 结合使用