web-dev-qa-db-fra.com

Mappage de type Serial PostgreSQL avec annotations Hibernate

J'utilise Hibernate 3.3 et PostgreSQL 8.x et souhaitez utiliser des annotations Hibernate pour mapper une colonne auto-incrémentée qui n'est pas une clé primaire.

Peu importe que la colonne soit mappée à l'aide de type série ou de séquences de Postgres tant qu'elle devient automatiquement incrémentée par la base de données et non par hibernate. J'ai essayé les mappages suivants, mais ils ont toujours généré NULL commanderid.

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

J'apprécierai toute aide avec cela.

Merci

24
alecswan

La cartographie suivante devrait fonctionner correctement:

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

Notez cependant que la valeur générée pour des objets fraîchement sauvegardées n'est pas disponible avant que la session ne soit rinçue.

EDIT : Notez que cette cartographie n'affecte pas ne rend pas hibernate de créer une colonne de type serial pendant la génération de schéma, car Hibernate ne sait rien sur la nature de la valeur génération au côté de la base de données. Par conséquent, si vous voulez que Hibernate crée une colonne avec un type approprié, vous devez spécifier explicitement:

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

Et sur une récente version hibernate (4.3), vous pouvez utiliser ceci:

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

la réponse acceptée ne fonctionne pas pour moi.

ceci a fait cependant:

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

J'utilise cela avec PostgreSQL9.1, devrait fonctionner avec 8 aussi:

@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