0

Oracle データベースにシーケンス オブジェクトがあります。

create sequence BASE_SEQ
minvalue 1
maxvalue 9999999999999999999999999999
start with 100
increment by 1
nocache;

Web アプリケーションに jpa(toplink) を使用しています。すべての db オブジェクトの基本クラスがあります。

@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

public class AbstractEntity implements Serializable {
    protected BigDecimal id;

    @javax.persistence.Column(name = "ID")
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BASE_SEQ")
    @SequenceGenerator(name="BASE_SEQ",sequenceName="BASE_SEQ", catalog = "DOF")
    public BigDecimal getId() {
        return id;
    }

このクラスは、いくつかのエンティティによって継承されます。アプリケーションを起動し、いくつかのエンティティを db に永続化/マージした後、それらの PK が (予想される 100 ではなく) 51 で始まることがわかります。

その後、データベースに移動し、シーケンス オブジェクトの DDL を表示して、次のように変更されていることを確認します。

create sequence BASE_SEQ
minvalue 1
maxvalue 9999999999999999999999999999
start with 101
increment by 1
nocache;

なぜそうなるのですか?PK 51、52 ​​... などのいくつかのエンティティと、101 で始まるシーケンスがあります。

AS-GlassFish 3.1.1

4

1 に答える 1

1

SequenceGenerator のデフォルトの preallocationSize は 50 です。これは、1 に設定したシーケンスの増分と一致する必要があります。

インクリメントを 50 に変更するか (推奨)、preallocationSize を 1 に変更します (挿入のパフォーマンスが低下します)。

于 2011-09-26T14:22:19.367 に答える