【问题标题】:OpenJPA Sequence generator with negative values具有负值的 OpenJPA 序列生成器
【发布时间】:2016-10-14 11:39:54
【问题描述】:

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

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

否定键的生成器是这样定义的:

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)

【问题讨论】:

  • 作为短期修复,我修改了生成器:'START WITH -99999 INCREMENT BY 1'。不是很漂亮,但很管用。
  • 必须是特定于 DB2 z/OS 的错误/功能——它在 Linux 上按预期工作。

标签: java db2 openjpa db2-zos


【解决方案1】:

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

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

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

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

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

创建序列 SEQ_MYSEQ 作为整数开始,以 -1 递增 -1 MINVALUE -999999 MAXVALUE 0;

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

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

请注意,我告诉 JPA 从 -1 开始,并使用 1 的 allocationSize。JavaDocs 声明默认值为 50。allocationSize 为 1 的一个遗憾(但不是显示停止器)是 JPA 提供程序将为每个序列值进入数据库(即不使用本地缓存)。但是,如果不使用它,OpenJPA 和 EclipseLink 似乎都希望按分配大小进行计数。数数是硬编码的。也就是说,任何一个都会向数据库询问下一个值,然后从那里按分配大小向上计数,而不是向下计数。在 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 不喜欢负值????

谢谢,

希思·托曼

【讨论】:

    猜你喜欢
    • 2017-09-21
    • 1970-01-01
    • 2019-02-25
    • 2019-05-12
    • 2013-09-17
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    相关资源
    最近更新 更多