Jeg tror, at det accepterede svar fra Petar ikke er korrekt, eller ikke længere er korrekt. Den automatiske stigning i Postgres håndteres gennem SERIAL
pseudotype, det er korrekt. Den kortlægning, som Petar giver, vil dog resultere i følgende DDL genereret af Hibernate 5.1:
CREATE SEQUENCE users_id_seq START 1 INCREMENT 50;
CREATE TABLE … (
id INT8 NOT NULL,
…
);
Dette bruger ikke SERIAL
, men en Dvale-styret sekvens. Det ejes ikke af tabellen, og der er ikke angivet nogen standardværdi. Selvfølgelig er DDL-generering en funktion, som mange mennesker ikke bruger i produktionen (men mange tager den genererede kode som en skabelon).
Hvis du håndskriver din DDL og faktisk brugte SERIAL
, og derefter bruge GenerationType.SEQUENCE
kan endda være i konflikt med databasens adfærd. Den korrekte måde at kortlægge Hibernate med Postgres' foretrukne ID-strategi er at bruge GenerationType.IDENTITY
. Koden er i øvrigt også meget kortere og mere læsbar:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;