17

頭が回らない問題があります。休止状態では、次のことに問題はありません。

@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 が負の数を作成し、allocationSize と等しくなければならないことがわかります。

「initialValue=500」を追加し、DDL スクリプトを「START 500」に更新すると、これは修正されますが、番号付けは 1 ではなく 500 から始まります。これは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を作成することは不可能であることを意味します。

4

3 に答える 3

25

デフォルトで@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;
}

「連続した」エンティティIDは、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;

お役に立てば幸いです。

于 2013-11-28T13:23:55.853 に答える
2

シーケンスは 1 ではなく 500 から開始する必要があります。1 から開始すると、最初の nextval は 500 ではなく 1 つの ID しか提供しません。

それ以外の場合は、設定後にシーケンスで nextval を呼び出すため、501 になります。

エラーは警告ですか、それともエラーですか? 無視しても効果はありますか?

于 2013-08-28T15:11:20.947 に答える