web-dev-qa-db-ja.com

EclipseLinkとシーケンスジェネレータの事前割り当て

頭が動かないという問題があります。 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で、allocationSizeと等しくなければならない場合に、EclipseLinkが負の数を作成することがわかります。

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

15
robert_difalco

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

お役に立てば幸いです。

20
wypieprz

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

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

エラーは警告ですか、それともエラーですか?無視しても機能しますか?

2
James

スキーマ生成に文を追加することで問題を修正できます:[〜#〜] restart [〜#〜]

エンティティ定義

@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スキーマの初期化

-- 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
Simon De Uvarow