我正在使用一些映射到 Oracle 数据库表的实体。对于 ID 生成,我使用注释如下的序列生成器:
@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 中打开了以下属性,以获取在生成的语句中使用的绑定(bind)参数。
<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 的数据集。我得到一个异常(exception):
java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (JASON.SYS_C0084866) violated
没有通过 eclipse 的任何缓存影响序列生成或者这可能是什么错误?
使用的组件:
GlassFish 3.1.1
EclipseLink 2.3.0.v20110604-r9504
数据库:Oracle 版本:Oracle Database 11g Release 11.1.0.7.0 - 64bit
驱动: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 和序列 DDL 之间的分配大小和增量匹配。
关于java - JPA Eclipselink 得到错误的序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15404636/