web-dev-qa-db-ja.com

Hibernateアノテーションを使用したPostgreSQLシリアルタイプのマッピング

Hibernate 3.3とPostgreSQL 8.xを使用していますが、Hibernateアノテーションを使用して、主キーではない自動インクリメントされた列をマップします。

列がHibernateではなくデータベースによって自動インクリメントされる限り、列がPostgresのSERIALタイプまたはシーケンスを使用してマップされているかどうかは関係ありません。次のマッピングを試しましたが、常にnullのorderIdが生成されました。

@Column(name = "orderId", insertable = false)
@Generated(GenerationTime.INSERT)
//@GeneratedValue(strategy = javax.persistence.GenerationType.AUTO)
private Integer orderId;

私はこれでどんな助けにも感謝します。

ありがとう

24
alecswan

次のマッピングは正常に機能します。

@Column(name = "orderId")
@Generated(GenerationTime.INSERT)
private Integer orderId;

ただし、新しく保存されたオブジェクトに対して生成された値は、セッションがフラッシュされるまで使用できないことに注意してください。

編集:このマッピングは影響を与えないことに注意してください。Hibernateは値の性質について何も知らないため、スキーマ生成中にHibernateがタイプserialの列を作成することはありません。データベース側での生成。したがって、Hibernateに適切なタイプの列を作成させたい場合は、それを明示的に指定する必要があります。

@Column(name = "orderId", columnDefinition = "serial")
@Generated(GenerationTime.INSERT)
private Integer orderId;

そして、最近のHibernateバージョン(4.3)では、これを使用できます。

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long orderId;
31
axtavt

受け入れられた答えは私にとってはうまくいきません。

これはしかし:

@Id
@Column(name = "your_id", columnDefinition = "serial")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer yourId;
22
pstanton

私はこれをpostgresql9.1で使用しています。8でも動作するはずです。

@SequenceGenerator(allocationSize=1, initialValue=1, sequenceName="account_id_seq", name="account_id_seq")
@GeneratedValue(generator="account_id_seq", strategy=GenerationType.SEQUENCE)
@Id
@Column(name="id")
private Integer id;
4
bjonczy