当前位置: 首页 > 面试题库 >

EclipseLink和Sequence Generator预分配

易宣
2023-03-14
问题内容

我有一个问题,我无法解决。在hibernate状态下,我没有以下问题:

@GeneratedValue( strategy = GenerationType.AUTO, generator = "email-seq-gen" )
@SequenceGenerator( name="email-seq-gen", sequenceName="EMAIL_SEQ_GEN", allocationSize=500 )

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

CREATE SEQUENCE EMAIL_SEQ_GEN START 1 INCREMENT 500;

这里没什么可看的。一切正常。但是,如果我将提供程序切换到EclipseLink,则会出现此错误:

The sequence named [EMAIL_SEQ_GEN] is setup incorrectly.  Its increment does not match its pre-allocation size.

因此,我当然会四处搜索,如果初始值为1且它应该等于分配大小,那么我会看到有关EclipseLink创建负数的一些信息。

因此,好的,因此添加“ initialValue = 500”并将DDL脚本更新为“ START
500”即可解决此问题,但是现在我的编号从500开始而不是1。这是EclipseLink错误还是我不了解的东西?我想生成从1开始并具有调整至实体(在这种情况下为500)的分配大小的序列。我该如何使用EclipseLink?

谢谢!

提出此问题的另一种方法是....鉴于此DDL:

CREATE SEQUENCE EMAIL_SEQ_GEN START 1 INCREMENT 500;

注释我的实体以将其与EclipseLink一起使用的正确方法是什么?

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

@GeneratedValue( strategy = GenerationType.AUTO, generator = "email-seq-gen" )
@SequenceGenerator( name="email-seq-gen", sequenceName="EMAIL_SEQ_GEN", initialValue=1, allocationSize=500 )

将生成此:

CREATE SEQUENCE EMAIL_SEQ_GEN INCREMENT BY 500 START WITH 500;

哪种暗示无法使用EclipseLink创建带有“ START WITH 1”的DDL。


问题答案:

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

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;
}

EclipseLink似乎使用以下公式来计算“顺序”实体标识:

entityId = initialValue - allocationSize + INCREMENT_BY

或使用DDL:

entityId = START_WITH - allocationSize + INCREMENT_BY

回到您的特殊情况:

@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;

产生

entityId = 1 - 500 + 1 = -500 // EclipseLink error
@SequenceGenerator( 
    name="email-seq-gen", 
    sequenceName="EMAIL_SEQ_GEN", 
    initialValue=1, 
    allocationSize=500 )

CREATE SEQUENCE EMAIL_SEQ_GEN START WITH 1 INCREMENT BY 500;

产生

entityId = 1 - 500 + 1 = -500 // EclipseLink error
@SequenceGenerator( 
    name="email-seq-gen", 
    sequenceName="EMAIL_SEQ_GEN", 
    initialValue=500, 
    allocationSize=500
)

CREATE SEQUENCE EMAIL_SEQ_GEN START WITH 500 INCREMENT BY 500;

产生

entityId = 500 - 500 + 500 = 500 // fine, but inappropriate
entityId = 500 - 500 + 1000 = 1000 // incremented by 500
entityId = 500 - 500 + 1500 = 1500 // incremented by 500
...

为了满足您的要求,应使用以下一种:

@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;

产生

entityId = 500 - 500 + 1 = 1
entityId = 500 - 500 + 2 = 2
entityId = 500 - 500 + 3 = 3
...

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

DROP SEQUENCE email_seq_gen RESTRICT;

希望对您有所帮助。



 类似资料:
  • 问题内容: 我们都知道使用Hibernate时的默认行为-它使实际数据库序列增加 一 ,将该值乘以50(默认值)-然后将该值用作实体ID。 这是错误的行为,并与说明以下内容的规范冲突: distributionSize-(可选)从序列中分配序列号时要增加的数量。 需要明确的是:我不关心生成的ID之间的差距。 我关心与基础数据库序列 不一致的 ID 。例如:任何其他应用程序(例如,使用纯JDBC)可

  • 使用带有规范和分页的Eclipse Link JPA 2.5.2,我对Oracle ROWNUM的执行方式有问题。Eclipse Link生成的查询如下: 为第一页运行该查询应返回0到25之间的行,为第二页运行相同的查询应返回25到50之间的行。 问题是第一页的记录也出现在第二页,我猜是因为submitteddate可以包含NULL值并且ORDER BY子句在ROWNUM和rnum条件或类似的东西

  • 有人知道这是什么问题吗?这真的要了我的命。

  • EclipseLink有可能和夸库斯一起使用吗?还是夸库斯太难与Hibernate耦合了? 我们正在选择我们的MP实现的过程中,我们希望尽可能接近参考信息 我在https://quarkus.io/guides/甚至这个论坛上都没有看到太多信息来表明eclipselink也可以与Quarkus一起使用。 任何关于夸库斯为什么与JPA的一个特定的impl(如果是的话)绑得如此紧密的指示也将是受欢迎的

  • 我有一个使用JPA注释生成数据库主键的代码。一个数据库序列用于使用Oracle DB生成PK.Am 现在我对此的理解是:DB sequencer返回的sequence id作为rec_id。这是正确的吗? 医生说: 序列策略序列策略由两部分组成——定义命名序列和在一个或多个类的一个或多个字段中使用命名序列。@Sequence Generator注释用于定义序列并接受名称、初始值(默认值为1)和分配

  • 我可以使用Hibernate,但我正在尝试更改为Eclipselink。我一直在寻找解决办法,但没有结果。人们建议把这两个(不是放在一起) persitence.xml 应用程序-context.xml 错误