2

私はOpenJPA2.0、WebSphere V8を使用しており、データベースはDB2V10です。

以下の構文を使用して作成されたシーケンス

CREATESEQUENCE"MYSCHEMA"。"SEQ_TABLEA"AS INTEGER START WITH 1 INCREMENT BY 1 MINVALUE 1000 MAXVALUE 2147483647 NO CYCLE CACHE 100 ORDER;

私のエンティティクラス定義は、以下のシーケンスを使用します

@Entity
@Table(name="MYSCHEMA.SEQ_TABLEA")
public class MyEntity implements Serializable {

    @Id
    @SequenceGenerator(name="TABLEA_ID_GENERATOR", sequenceName="MYSCHEMA.SEQ_TABLEA")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="TABLEA_GENERATOR")
    @Column(name="ID")
    private Integer myId;

    ..

3〜4日間にわたってTABLEAに複数回挿入した後、シーケンス番号が多くの値をスキップしていることがわかりました。シーケンスが作成されたインサートは、1,2,3,100,101,102,103,104,105,200,201,202,300,301,302,303,304,305,306,307,308,309,310,400などです。

何が悪いのかについての見解はありますか?挿入中にエラーは見つかりませんでした。この期間中にDBもバウンスされませんでした。

4

2 に答える 2

2

これはほとんど正常な動作です。シーケンサーは、値の間隔をプリフェッチ/事前再取得します(そして、間隔パラメーターをデータベースに保存します)が、何らかの理由で、それらのすべての値に実際に(エンティティを保存する)使用することはありません。後でその間隔の最後の値に達すると、前の間隔のすべての値が使い果たされたかどうかを気にかけたり再確認したりせずに、新しい値を作成します。

于 2012-11-29T11:52:26.893 に答える
2

@SequenceGenerator注釈に割り当てサイズを設定してみてください。これは、シーケンス番号を割り当てるときに増分する量を指定します。

@SequenceGenerator(name="TABLEA_ID_GENERATOR", 
  sequenceName="MYSCHEMA.SEQ_TABLEA", allocationSize=1)

Java API

JPAのシーケンスに関する優れた記事

于 2012-11-29T11:52:33.117 に答える