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;
私はこれでどんな助けにも感謝します。
ありがとう
次のマッピングは正常に機能します。
@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;
受け入れられた答えは私にとってはうまくいきません。
これはしかし:
@Id
@Column(name = "your_id", columnDefinition = "serial")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer yourId;
私はこれを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;