热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java–JPAEclipselink获取错误的序列号

我正在使用映射到OracleDB-Tables的一些实体.对于ID-Generation,我使用的注释序列生成器如下:@Id@SequenceGenerato

我正在使用映射到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

非是否有任何缓存通过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

提前致谢

阿德姆

解决方法:

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


推荐阅读
author-avatar
黒彡白小彩电邦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有