2013-03-14 58 views
2

我正在使用映射到Oracle DB-Tables的一些实体。对于ID代我使用注解如下序列发生器:JPA Eclipselink错误序列号

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

在PROGRAMM执行我提出一个新的实例从我的实体,并希望保留此生成一个。重新启动数据库后,我通过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生成的serialNo必须是唯一的,现在我仍然有一些这个serialNo的数据集。我得到一个例外:

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

非是否有任何缓存通过日食影响序列生成或什么可能是这个错误?

使用的组件:
的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

预先感谢

阿德姆

+0

有没有什么好运算出来呢? – 2013-03-14 15:55:00

回答

7

当您创建序列时,您指定了一个增量为的大小。例如该序列由1

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

递增当使用SequenceGenerator标注在JPA可以指定分配大小。

@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之间的分配大小和增量匹配。

+0

我不认为这是这里的原因 - EclipseLink验证allocationSize和INCREMENT BY匹配,并将抛出一个异常,明确指出如果不是这种情况 – MRalwasser 2013-03-15 20:25:09

+0

您的示例中存在错误,allocateSize应该在SequenceGenerator上而不是GeneratedValue – bjartek 2013-04-30 12:19:07

+0

@bjartek谢谢,示例已修复。 – 2013-04-30 12:25:27

1

更改分配大小= by allocationSize = ,这是一个Eclipselink错误。