具有负值

时间:2016-10-14 11:39:55

标签: java db2 openjpa db2-zos

环境:Websphere 8.5,OpenJPA 2.0,DB2 z / OS

有两个表:一个包含已验证的数据,另一个包含草稿数据(临时表)+查看显示两个表的信息。
为避免主键冲突,我确定登台表将负值作为主键。它在纯SQL中工作,但是当我尝试在Java代码中为staging表定义生成器时,我的方法失败了

负面密钥的生成器定义如下:

CREATE SEQUENCE X AS INTEGER START WITH -1 INCREMENT BY -1
MINVALUE -999999 MAXVALUE 0

在实体方面:

@Id
@SequenceGenerator(name="X", sequenceName="X")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="X")
@Column(name = "ID")`

第一个元素已成功创建(值为-1),但第二个元素的插入失败,带有

  

身份栏或序列的价值范围被排除。 SQLCODE = -359,SQLSTATE = 23522

你能帮我定义一下@SequenceGenerator吗?是否可以在Open JPA 2.0下使用?也许序列定义错误(MINVALUE / MAXVALUE)

1 个答案:

答案 0 :(得分:0)

首先,我认为您选择“START WITH -99999 INCREMENT BY 1”是最佳选择。我不确定你为什么觉得它“不漂亮”。如果你这样做:

CREATE SEQUENCE SEQ_MYSEQ AS INTEGER START WITH -99999 INCREMENT BY 1 MINVALUE -999999 MAXVALUE 0

你仍然在-99999和0之间的范围,对吧?

正如我将在下面解释的那样,我认为OpenJPA和EclipseLink喜欢计算。所以我认为你会有更好的运气。

那就是说,让我回答你的开场白问题。我已经对OpenJPA和EclipseLink进行了测试(因为WebSphere在WAS v9和Liberty中使用了Ecliplselink)。我不能让你的场景与EclipseLink一起工作,但可以让它与OpenJPA一起使用(但它并不漂亮)。让我说明我做了什么:这是我用我定义的序列的SQL(正如你在描述中所列出的那样):

CREATE SEQUENCE SEQ_MYSEQ AS INTEGER START WITH -1 INCREMENT BY -1 MINVALUE -999999 MAXVALUE 0;

我在我的实体中将我的序列生成器定义为:

@Id @SequenceGenerator(name =“IDGENERATOR”,sequenceName =“SEQ_MYSEQ”,allocationSize = 1,initialValue = -1) @GeneratedValue(strategy = GenerationType.SEQUENCE,generator =“IDGENERATOR”) private int id;

请注意,我告诉JPA从-1开始,并使用allocationSize为1. JavaDocs声明默认值为50.一个令人头疼(但不是show stop),其allocationSize为1是JPA提供者将为每个序列值转到数据库(即不使用本地缓存)。但是,如果不使用它,OpenJPA和EclipseLink似乎都希望按分配大小计算。它很难编码。也就是说,任何一个都会向DB请求下一个值,然后通过allocationSize从那里开始计数,而不是倒计时。在OpenJPA上,您需要使用此属性:

否则,默认情况下,OpenJPA执行'ALTER SEQUENCE'以确保SequenceGenerator中定义的INCREMENT BY与数据库中的内容匹配。如果我不添加此属性,我会得到关于范围耗尽的相同异常。无论如何,有了这个,一切都适用于OpenJPA。在EclipseLink上,我得到了这个例外:

异常说明:名为[SEQ_MYSEQ]的序列设置不正确。其增量与其预分配大小不匹配。     在org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:510)     在hat.test.MySeqTest.main(MySeqTest.java:28)

我没有深入研究EclipseLink来解决这个问题,但我确实尝试了一下Sequence,看起来EclipseLink不喜欢负值????

谢谢,

Heath Thomann