Je pense que la réponse acceptée de Petar n'est pas correcte, ou n'est plus correcte. L'auto-incrémentation dans Postgres est gérée via SERIAL
pseudo type, c'est correct. Cependant, le mappage fourni par Petar entraînera le DDL suivant généré par Hibernate 5.1 :
CREATE SEQUENCE users_id_seq START 1 INCREMENT 50;
CREATE TABLE … (
id INT8 NOT NULL,
…
);
Ceci n'utilise pas SERIAL
, mais une séquence gérée par Hibernate. Il n'appartient pas à la table et aucune valeur par défaut n'a été définie. Bien sûr, la génération DDL est une fonctionnalité que beaucoup de gens n'utilisent pas en production (mais beaucoup prennent le code généré comme modèle).
Si vous écrivez à la main votre DDL et que vous avez réellement utilisé SERIAL
, puis en utilisant GenerationType.SEQUENCE
peut même entrer en conflit avec le comportement de la base de données. La bonne façon de mapper Hibernate avec la stratégie d'identification préférée de Postgres est d'utiliser GenerationType.IDENTITY
. Incidemment, le code est également beaucoup plus court et plus lisible :
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;