JPA Eclipselink获取错误的序列号

时间:2013-03-14 08:46:18

标签: java jpa eclipselink sequence

我正在使用映射到Oracle DB-Tables的一些实体。对于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>

例如:如果我生成一个我的实体的新实例并希望保留这个实例,那么对于serialNo我会得到2717,如果我执行

SELECT SEQUENZ_RULES.NEXTVAL FROM DUAL 

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

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

提前致谢

阿德姆

2 个答案:

答案 0 :(得分: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之间的分配大小和增量匹配。

答案 1 :(得分:1)

通过allocationSize = 2 更改allocationSize = 1 ,这是一个Eclipselink错误。