首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带负值的OpenJPA序列发生器

带负值的OpenJPA序列发生器
EN

Stack Overflow用户
提问于 2016-10-14 11:39:54
回答 1查看 473关注 0票数 0

环境:WebSphere8.5,OpenJPA 2.0,DB2 z/OS

有两个表:一个具有验证数据,另一个具有草稿数据(暂存表)+ View,显示来自两个表的信息。

为了避免主键冲突,我决定暂存表将负值作为主键。它在普通SQL中工作,但当我试图为Java代码中的暂存表定义生成器时,我的方法失败了。

负键生成器的定义如下:

代码语言:javascript
复制
CREATE SEQUENCE X AS INTEGER START WITH -1 INCREMENT BY -1
MINVALUE -999999 MAXVALUE 0

在实体方面:

代码语言:javascript
复制
@Id
@SequenceGenerator(name="X", sequenceName="X")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="X")
@Column(name = "ID")`

成功地创建了第一个元素(值-1),但是插入第二个元素失败了。

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

你能帮我定义@SequenceGenerator吗?在OpenJPA2.0下有可能吗?也许序列定义是错误的(MINVALUE/MAXVALUE)

EN

回答 1

Stack Overflow用户

发布于 2016-10-26 04:01:46

首先,我认为你的选择是“从-99999增量1开始”是最好的选择。我不知道你为什么觉得它“不漂亮”。如果你这样做:

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

你的范围仍然在-99999到0之间,对吗?

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

尽管如此,让我回答你的第一个问题。我已经在OpenJPA和EclipseLink上运行了一个测试(因为WebSphere使用EclipseLink在WAS、v9和uses中)。我无法让您的场景与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")

注意,我告诉JPA从-1开始,并使用allocationSize为1。JavaDocs状态默认为50。allocationSize为1的一个缺点(但不是显示停止)是,JPA提供者将访问数据库中的每个序列值(即不使用本地缓存)。但是,如果不使用这一点,OpenJPA和EclipseLink似乎都希望通过分配大小来计算。数数是很难的。也就是说,任何一个人都会向DB请求下一个值,然后通过allocationSize从那里计数,而不是向下计数。在OpenJPA上,您需要使用以下属性:

否则,默认情况下,OpenJPA执行一个“ALTER序列”,以确保SequenceGenerator中定义的增量与数据库中的增量匹配。如果不添加此属性,就会得到相同的范围耗尽异常。总之,有了这个,所有这些都能很好地在OpenJPA上工作。在EclipseLink上,我得到了一个例外:

异常描述:名为SEQ_MYSEQ的序列设置错误。其增量与其预分配大小不匹配。在org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:510) at hat.test.MySeqTest.main(MySeqTest.java:28)

我没有在EclipseLink中挖掘出足够的信息来解决这个问题,但是我确实尝试了一下这个序列,似乎EclipseLink不喜欢负值?

谢谢,

希思·托曼

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40042286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档