3

我正在使用一些映射到 Oracle DB 表的实体。对于 ID-Generation,我使用了一个序列生成器,注释如下:

@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 中打开了以下属性,以获取生成语句中使用的绑定参数。

<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 生成的序列号必须是唯一的,现在我还有一些带有这个序列号的数据集。我得到一个例外:

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

非 Eclipse 是否有任何影响序列生成的缓存,或者这可能是什么错误?

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

提前致谢

亚当

4

2 回答 2

9

创建序列时,您指定了要递增的大小。例如,此序列以 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 和 Sequence DDL 之间的分配大小和增量匹配。

于 2013-03-14T08:52:51.453 回答
1

将 allocationSize= 1更改为 allocationSize= 2,这是一个 Eclipselink 错误。

于 2015-11-10T20:39:00.837 回答