Jag tror att det accepterade svaret från Petar inte är korrekt, eller inte längre korrekt. Den automatiska ökningen i Postgres hanteras genom SERIAL
pseudotyp, det stämmer. Mappningen som Petar ger kommer dock att resultera i följande DDL genererad av Hibernate 5.1:
CREATE SEQUENCE users_id_seq START 1 INCREMENT 50;
CREATE TABLE … (
id INT8 NOT NULL,
…
);
Detta använder inte SERIAL
, men en Hibernate-hanterad sekvens. Det ägs inte av tabellen och inget standardvärde har ställts in. Naturligtvis är DDL-generering en funktion som många inte använder i produktionen (men många tar den genererade koden som en mall).
Om du handskriver din DDL och faktiskt använde SERIAL
och sedan använda GenerationType.SEQUENCE
kan till och med komma i konflikt med databasens beteende. Det korrekta sättet att mappa Hibernate med Postgres föredragna ID-strategi är att använda GenerationType.IDENTITY
. För övrigt är koden också mycket kortare och mer läsbar:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;