2011-09-17 1 views
2

JPAを実際に習得しようとしていますが、@ SequenceGeneratorに問題があります。
EclipseLinkでderby埋め込みデータベースを使用しています。私は、SequenceGeneratorアノテーションをPersonエンティティのIDに適用しようとしています。
は、ここで私はそのために使用しているコードです:今@ SequenceGeneratorとDerbyEmbeddedの問題

@Id 
    @SequenceGenerator(name="Person_SEQ", allocationSize=5, initialValue=1) 
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="Person_SEQ") 
    private int id; 


問題、私は(「初めて」アプリケーションを起動するたびにそれは私が以前に作成したデータ・ベースを削除し、再試行していることを意味していることです)、私はこれを得る例外:

[EL Warning]: 2011-09-17 22:25:03.649--ServerSession(31484215)--Exception  [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.SQLSyntaxErrorException: SEQUENCE 'PERSON_SEQ' does not exist. 
Error Code: 30000 
Call: VALUES(NEXT VALUE FOR Person_SEQ) 
Query: ValueReadQuery(sql="VALUES(NEXT VALUE FOR Person_SEQ)") 

この動作は正常ですか?
_ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __

私がチェックしまし生成されたcreateDLL.jdbcと、ここでPersonテーブルに関して与えられた内容を示します。

CREATE TABLE PERSON (ID INTEGER NOT NULL, FIRSTNAME VARCHAR(255), LASTNAME VARCHAR(255), NONSENSEFIELD VARCHAR(255),PRIMARY KEY (ID)) 
CREATE SEQUENCE Person_SEQ INCREMENT BY 5 START WITH 5 

私はなぜそれが1ではなく5で始まったのだろうか?

__ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __

私はいくつかの新しい人物をアプリケーション(同じデータベースでこの時間)を再起動すると、挿入時にidがこれまでallocationSizeからジャンプしていることも考え出しました。私は2番目の実行で29

  • に1から始まるIDのプールを作成した最初の実行、29人挿入した

    • :ここに私の自己を明確にするためには、私が通過してきたシナリオです(アプリケーションをシャットダウンし、それをリニューアル後)私はまた、99

    に(代わりに30 !!の)から始まるIDのプールを作成した、29人を挿入することは、組み込みDerbyこの問題ですドライバ?または私は何か他の行方不明ですか?

  • 答えて

    2

    エラーが発生する可能性が最も高いのは、シーケンスが存在するかどうかをEclipseLinkが確認していて、シーケンスが存在しない場合にのみ作成することです。配列がalloactedさ初めてそれはJPAが原因5

    ジャンプの事前割り当てサイズの、1-5を使用できることを意味し、5を返す必要があるため

    5と開始が使用されています71は、おそらくサーバー上のDerbyキャッシング・シーケンスIDによって発生します。必要に応じてDDLにキャッシュオプションを設定することもできますが、穴に問題はないはずです。通常は、事前割り当てサイズが大きければ大きいほど良いでしょう。ちょうどintではなく、あなたのIDのために長いを使用するようにしてください。

    +0

    私が開発しようとしているアプリケーションは、同じデータベースを長期間使用することを意味するものではなく、新しい年ごとにデータベースが再生成され、IDが非常に高い値、あなたは本当に長いタイプを使用する必要があると思いますか?あなたの答えは私が期待していたものです!ありがとう –

    関連する問題