ejb3とPostgreSQLでSerialとbigSerialを使用するにはどうすればよいですか?
2 に答える
EJB3 と言うとき、Java EE 5 の EJB3 仕様の一部であり、Java EE 6 では JPA 2 に分離されているJava Persistence API (JPA)を使用するつもりであると仮定します。
またはInteger
、Long
通常の注釈@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.xml
JPA を有効にするには、ファイルが必要です。エンティティへのアクセスは、EntityManager
から取得するEntityMangerFactory
か、より一般的には を使用して注入することによって行われ@PersistenceContext
ます。JPA のドキュメントと、ネット上の無数のチュートリアルを参照してください。
JPA 実装は、ほとんどのアプリケーション サーバーに付属しています。Glassfish 3 は EclipesLink を出荷し、JBoss AS 7 は Hibernate 4 を出荷します。アプリ サーバーのドキュメントと JPA 仕様を参照してください。
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;
}
...........