3

現在、JMS クライアントから MDB に数秒ごとに約 3 つのメッセージを送信しています。MDB は、JPA エンティティ マネージャーを使用してデータを PostgreSQL に永続化します。これは、約 1 分程度で正常に動作します。

次に、問題はこのメッセージになります...

Caused by: javax.ejb.EJBException: Exception [EclipseLink-4002] (Eclipse Persistence
Services - 2.3.2.v20111125-r10461):org.eclipse.persistence.exceptions.DatabaseExcep
tion Internal Exception: org.postgresql.util.PSQLException: ERROR: duplicate key value
violates unique constraint "scan_pkey"
Detail: Key (id)=(984) already exists.
Error Code: 0
Call: INSERT INTO Scan (id, th, ag, dl) VALUES (?, ?, ?, ?
)
    bind => [11 parameters bound]

これが私の Scan エンティティです。

@Entity
@SequenceGenerator(name="scanIdGen", initialValue=1000, sequenceName="scan_seq")
@Table(name="Scan")
public class Scan implements Serializable {
    @Id
    @Column(name="id")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="scanIdGen")
    private Integer id;

    @Column(name="th")
    private Integer th;

    @Column(name="ag")
    private Integer ag;

    @Column(name="dl")
    private Integer dl;

    // ...
}

そして、これがデータベース スキーマです。

CREATE SEQUENCE scan_seq START 1000;
CREATE TABLE Scan (
    id       INTEGER DEFAULT NEXTVAL('scan_seq') PRIMARY KEY    
    th       INTEGER DEFAULT NULL,
    ag       INTEGER DEFAULT NULL,
    dl       INTEGER DEFAULT NULL
);

それほど大きな問題ではないように見えるもう 1 つの問題は、主キーが実際には 1000 ではなく、通常は 950 から始まることです。理由はわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

2

推測では、Glassfish/EclipseLink は、JPA 標準によって指定されたデフォルトのシーケンス増分 50 を (なんらかの非常識な理由で) 想定しています。PostgreSQL シーケンスのデフォルトは 1 ずつ増加します。

に 1 を指定allocationSizeします@SequenceGenerator。例:

@SequenceGenerator(name="scanIdGen", sequenceName="scan_seq", allocationSize=1)

またはIDENTITY生成戦略を使用します。

于 2012-10-04T03:09:27.727 に答える