带有负值的OpenJPA序列生成器



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

有两个表:一个是已验证的数据,另一个是草稿数据(staging表)+显示两个表的信息的视图。
为了避免主键冲突,我决定将staging表的主键值设为负值。它在纯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")`

第一个元素创建成功(value -1),但第二个元素

插入失败
标识列或序列的值范围已用尽。SQLCODE = -359, SQLSTATE = 23522

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

首先,我认为你选择做一个'START WITH -99999 INCREMENT BY 1'是最好的选择。我不知道你为什么觉得它"不漂亮"。如果你这样做:

创建序列SEQ_MYSEQ作为整数,从-99999开始,增加1 MINVALUE -999999 MAXVALUE 0

仍然在-99999和0之间,对吗?

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

话虽如此,让我来回答你的开场问题。我在OpenJPA和EclipseLink上运行了一个测试(因为WebSphere在WAS v9和Liberty中使用了eclipplselink)。我无法让您的场景与EclipseLink一起工作,但可以让它与OpenJPA一起工作(但它不是很漂亮)。让我说明一下我做了什么:这是我定义序列的SQL(就像您在描述中列出的那样):

CREATE SEQUENCE SEQ_MYSEQ AS INTEGER WITH -1 INCREMENT -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。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来弄清楚这一点,但我确实玩了一下序列,似乎EclipseLink不喜欢负值????

谢谢,

希思Thomann

相关内容

  • 没有找到相关文章

最新更新