1

ejb3とPostgreSQLでSerialとbigSerialを使用するにはどうすればよいですか?

4

2 に答える 2

2

EJB3 と言うとき、Java EE 5 の EJB3 仕様の一部であり、Java EE 6 では JPA 2 に分離されているJava Persistence API (JPA)を使用するつもりであると仮定します。

またはIntegerLong通常の注釈@Column、および.@GeneratedValue@SequenceGenerator

serialまたは列が ID 列であり、Java EE 6 から JPA 2 を使用していると仮定するbigserialと、次のように記述します。

@Entity
@Table(name = "thetable")
public class TheTable implements Serializable {

    @Id
    @SequenceGenerator(name="tablename_id_seq", sequenceName="tablename_id_seq", allocationSize=1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="tablename_id_seq")
    @Basic(optional = false)
    @NotNull
    @Column(name = "id", updatable=false)
    private Integer id;

    // other columns...

    // then accessors ("getters and setters")

}

BigSerial の場合は のLong代わりに使用しIntegerます。それ以外の場合は変更は必要ありません。

EJB3に含まれる元のJPAを使用して、上記がJava EE 5で有効かどうかは確認していません。Java EE 5 で JPA1 をサポートする必要がある場合は、さらに確認が必要になる場合があります。Java EE 5 をサポートする必要がある場合は、JPA の JSR 220 仕様から始めることをお勧めしますが、JPA2 と Java EE 6 コンテナーに移行するだけの方がはるかに優れています

エンティティごとに手動でシーケンスを定義することを単純に使用および回避できるはずであることに注意してください。GenerationType.IDENTITY残念ながら、少なくとも Hibernate では、すべてのテーブルに対してグローバルな「休止状態」シーケンスを使用することを前提としていますが、これはばかげています。

allocationSize=1が重要です。残念なことに、JPA は 50 の最小フェッチ サイズを指定し、nextval()呼び出されたときにシーケンスが 50 のジャンプでインクリメントされることを期待しています。シーケンスがそのように定義されていない限り、重複キー エラーが発生します。

META-INF/persistence.xmlJPA を有効にするには、ファイルが必要です。エンティティへのアクセスは、EntityManagerから取得するEntityMangerFactoryか、より一般的には を使用して注入することによって行われ@PersistenceContextます。JPA のドキュメントと、ネット上の無数のチュートリアルを参照してください。

JPA 実装は、ほとんどのアプリケーション サーバーに付属しています。Glassfish 3 は EclipesLink を出荷し、JBoss AS 7 は Hibernate 4 を出荷します。アプリ サーバーのドキュメントと JPA 仕様を参照してください。

于 2012-07-03T15:10:12.257 に答える
1

GenerationType.IDENTITY はシリアルに対して機能します

CREATE TABLE vmb_mails (ID SERIAL PRIMARY KEY ,TITLE TEXT ........

@Entity
@Table(name="vmb_mails")
@NamedQueries(
    @NamedQuery(name="getAllMails",query="SELECT  m from Mail m ORDER by m.entDate DESC ")
)
//@SequenceGenerator(name="Mails_Seq_Gen",sequenceName="vmb_mails_seq",allocationSize=1)
public class Mail implements Serializable
{
    private long id;
    private String title;
    private String fromAddr;

    public Mail()
    {

    }
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="ID")
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }

...........

于 2012-07-05T11:14:09.723 に答える