首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EclipseLink和序列生成器预分配

EclipseLink和序列生成器预分配
EN

Stack Overflow用户
提问于 2013-08-28 03:39:03
回答 3查看 15.8K关注 0票数 17

我有个问题我想不通了。在hibernate中,我在以下方面没有问题:

代码语言:javascript
复制
@GeneratedValue( strategy = GenerationType.AUTO, generator = "email-seq-gen" )
@SequenceGenerator( name="email-seq-gen", sequenceName="EMAIL_SEQ_GEN", allocationSize=500 )

然后在我的schema.ddl中有这个:

代码语言:javascript
复制
CREATE SEQUENCE EMAIL_SEQ_GEN START 1 INCREMENT 500;

这里没什么可看的。一切都按预期运行。但是,如果我将提供程序切换到EclipseLink,则会出现以下错误:

代码语言:javascript
复制
The sequence named [EMAIL_SEQ_GEN] is setup incorrectly.  Its increment does not match its pre-allocation size.

当然,我在谷歌上看到,如果初始值是1,那么EclipseLink就会创建一个负数,并且它应该等于allocationSize。

所以,好吧,添加"initialValue=500“并将我的DDL脚本更新为”start500“可以解决这个问题,但是现在我的编号从500开始而不是1。这是一个EclipseLink错误,还是有我不理解的地方。我希望生成从1开始的序列,并且具有调整到实体的分配大小(在本例中为500)。我该如何用EclipseLink做到这一点呢?

谢谢!

询问is....given的另一种方法是:

代码语言:javascript
复制
CREATE SEQUENCE EMAIL_SEQ_GEN START 1 INCREMENT 500;

注释实体以便在EclipseLink中使用它的正确方法是什么?

如果我让EclipseLink生成我的DDL,那么这是:

代码语言:javascript
复制
@GeneratedValue( strategy = GenerationType.AUTO, generator = "email-seq-gen" )
@SequenceGenerator( name="email-seq-gen", sequenceName="EMAIL_SEQ_GEN", initialValue=1, allocationSize=500 )

将生成以下内容:

代码语言:javascript
复制
CREATE SEQUENCE EMAIL_SEQ_GEN INCREMENT BY 500 START WITH 500;

这在某种程度上意味着不可能使用EclipseLink创建带有“从1开始”的动态链接库。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-28 21:23:56

默认情况下,使用@SequenceGenerator注释的实体使用initialValue=1和alocationSize=50。

代码语言:javascript
复制
public @interface SequenceGenerator {
    /** 
     * (Optional) The value from which the sequence object 
     * is to start generating.
     */
    int initialValue() default 1;

    /**
     * (Optional) The amount to increment by when allocating 
     * sequence numbers from the sequence.
     */
    int allocationSize() default 50;
}

一个“连续的”实体id似乎是由EclipseLink用以下公式计算出来的:

代码语言:javascript
复制
entityId = initialValue - allocationSize + INCREMENT_BY

或者在使用DDL的情况下:

代码语言:javascript
复制
entityId = START_WITH - allocationSize + INCREMENT_BY

回到你的特殊情况:

代码语言:javascript
复制
@SequenceGenerator( 
    name="email-seq-gen", 
    sequenceName="EMAIL_SEQ_GEN", 
    allocationSize=500
) // initialValue=1 (default)

CREATE SEQUENCE EMAIL_SEQ_GEN START WITH 1 INCREMENT BY 500;

产生

代码语言:javascript
复制
entityId = 1 - 500 + 1 = -500 // EclipseLink error

代码语言:javascript
复制
@SequenceGenerator( 
    name="email-seq-gen", 
    sequenceName="EMAIL_SEQ_GEN", 
    initialValue=1, 
    allocationSize=500 )

CREATE SEQUENCE EMAIL_SEQ_GEN START WITH 1 INCREMENT BY 500;

产生

代码语言:javascript
复制
entityId = 1 - 500 + 1 = -500 // EclipseLink error

代码语言:javascript
复制
@SequenceGenerator( 
    name="email-seq-gen", 
    sequenceName="EMAIL_SEQ_GEN", 
    initialValue=500, 
    allocationSize=500
)

CREATE SEQUENCE EMAIL_SEQ_GEN START WITH 500 INCREMENT BY 500;

产生

代码语言:javascript
复制
entityId = 500 - 500 + 500 = 500 // fine, but inappropriate
entityId = 500 - 500 + 1000 = 1000 // incremented by 500
entityId = 500 - 500 + 1500 = 1500 // incremented by 500
...

为了满足您的需求,应使用以下方法:

代码语言:javascript
复制
@SequenceGenerator( 
    name="email-seq-gen", 
    sequenceName="EMAIL_SEQ_GEN", 
    allocationSize=500 
) // initialValue=1 (default) but 'START WITH'=500

CREATE SEQUENCE EMAIL_SEQ_GEN START WITH 500 INCREMENT BY 1;

产生

代码语言:javascript
复制
entityId = 500 - 500 + 1 = 1
entityId = 500 - 500 + 2 = 2
entityId = 500 - 500 + 3 = 3
...

可以使用以下SQL command从基础数据库中删除现有序列

代码语言:javascript
复制
DROP SEQUENCE email_seq_gen RESTRICT;

我希望它能帮上忙。

票数 25
EN

Stack Overflow用户

发布于 2013-08-28 23:11:21

你的序列应该从500开始,而不是1。如果你从1开始,那么第一个nextval将只给你1个id,而不是500。

否则,在设置序列后对序列调用nextval,这样它就会到达501。

该错误是警告还是错误?如果你忽略它,它还能工作吗?

票数 2
EN

Stack Overflow用户

发布于 2018-08-11 04:24:15

我可以通过在模式生成中添加一句话来修复这个问题:重新启动

实体定义

代码语言:javascript
复制
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator=Secuences.PROFILES_SEQ)
@SequenceGenerator(name=Secuences.PROFILES_SEQ, sequenceName=Secuences.PROFILES_SEQ, allocationSize=25)
@Column( name = "id" )
private Long internalId;

SQL架构初始化

代码语言:javascript
复制
-- create sequence
CREATE SEQUENCE PROFILES_SEQ START WITH 1;

-- use sequence to set values in column
UPDATE public.cc_user_profile SET id = nextval('PROFILES_SEQ');

-- update sequence
ALTER SEQUENCE PROFILES_SEQ INCREMENT BY 25 START WITH 25;
ALTER SEQUENCE PROFILES_SEQ RESTART;

希望这能帮助到别人。

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

https://stackoverflow.com/questions/18474046

复制
相关文章

相似问题

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