JPA Eclipselink错误的序列号
我正在使用一些映射到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中启用了以下属性,以获取生成的语句中使用的绑定参数。
例如:如果我生成一个我的实体的新实例并希望保留这个实例,那么我将获得2717 for serialNo并且如果我执行
SELECT SEQUENZ_RULES.NEXTVAL FROM DUAL
我得到2767作为nextval。 问题是JPA生成的serialNo必须是唯一的,现在我仍然有一些带有这个serialNo的数据集。 我得到一个例外:
java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (JASON.SYS_C0084866) violated
Non是否有任何缓存通过eclipse影响序列生成或可能是什么错误?
二手组件:
GlassFish 3.1.1
EclipseLink 2.3.0.v20110604-r9504
数据库:Oracle版本:Oracle Database 11g 11.1.0.7.0版 – 64位
驱动程序: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和Sequence DDL之间的分配大小和增量匹配。
通过allocationSize = 2更改allocationSize = 1 ,这是一个Eclipselink错误。