java - JPA Eclipselink 得到错误的序列号

标签 java jpa eclipselink sequence

我正在使用一些映射到 Oracle 数据库表的实体。对于 ID 生成,我使用注释如下的序列生成器:

@Id
@SequenceGenerator(name = "SEQ_RULES", sequenceName = "SEQUENZ_RULES")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_RULES")
@Column(name = "SERIALNO")
protected Long serialno;

在程序执行期间,我从我的实体创建了一个新实例,并希望保留这个生成的实例。重新启动数据库后,我通过 JPA-EclipseLink 获得了错误的序列号,但不是通过直接在数据库上的控制台获得的。

我在 persistence.xml 中打开了以下属性,以获取在生成的语句中使用的绑定(bind)参数。

<properties>
  <property name="eclipselink.logging.level" value="FINE"/>
  <property name="eclipselink.logging.parameters" value="true"/>
</properties>

例如:如果我生成我的实体的一个新实例并想保留这个实例,我会得到 2717 的 serialNo 并且如果我执行

SELECT SEQUENZ_RULES.NEXTVAL FROM DUAL 

我得到 2767 作为 nextval。问题是 JPA 生成的 serialNo 必须是唯一的,现在我仍然有一些带有这个 serialNo 的数据集。我得到一个异常(exception):

java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (JASON.SYS_C0084866) violated

没有通过 eclipse 的任何缓存影响序列生成或者这可能是什么错误?

使用的组件:
GlassFish 3.1.1
EclipseLink 2.3.0.v20110604-r9504
数据库:Oracle 版本:Oracle Database 11g Release 11.1.0.7.0 - 64bit
驱动:Oracle JDBC驱动版本:11.2.0.1.0

最佳答案

当您创建序列时,您指定了一个递增的大小。例如,此序列递增 1。

CREATE SEQUENCE supplier_seq
  MINVALUE 1
  MAXVALUE 999999999999999999999999999
  START WITH 1
  INCREMENT BY 1
  CACHE 20;

在 JPA 中使用 SequenceGenerator 注释时,您可以指定分配大小。

@Id
@SequenceGenerator(name = "SEQ_RULES", sequenceName = "SEQUENZ_RULES",
    allocationSize=1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_RULES")
@Column(name = "SERIALNO")
protected Long serialno;

确保 JPA 和序列 DDL 之间的分配大小和增量匹配。

关于java - JPA Eclipselink 得到错误的序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15404636/

相关文章:

java - 使用包含 CDATA 的 XML 配置 MOXy 的 @XmlPath

java - Netty ServerBootStrap 选项或 childOption 及其缓冲区大小对速度的影响

java - BitmapFactory for java 给出 OutOfMemory 异常,想要 > 12mb...不知道为什么它这么大

java - 两个相关 JPA 实体之间的接口(interface)

hibernate - 带有 session 作用域 bean 的 LazyInitializationException

java - 如何强制 EclipseLink 的 @PrivateOwned 在插入前执行删除

java - JPA 错误 : duplicate key error when persisting a relationship

java - 获取一系列List<Object>列表

java - 该处理程序可能是静态的,或者蓝牙处理程序可能会发生泄漏

java - 配置hibernate jpa和spring mvc(entityManager始终为null)