Myślę, że przyjęta odpowiedź Petara jest nieprawidłowa lub już nie jest poprawna. Auto-inkrementacja w Postgresie jest obsługiwana przez SERIAL
pseudo typ, to prawda. Jednak mapowanie, które podaje Petar, da w wyniku następujący kod DDL wygenerowany przez Hibernate 5.1:
CREATE SEQUENCE users_id_seq START 1 INCREMENT 50;
CREATE TABLE … (
id INT8 NOT NULL,
…
);
To nie używa SERIAL
, ale sekwencja zarządzana przez Hibernate. Nie należy do tabeli i nie ustawiono wartości domyślnej. Oczywiście generowanie DDL to funkcja, której wiele osób nie używa w produkcji (ale wielu przyjmuje wygenerowany kod jako szablon).
Jeśli piszesz ręcznie swój DDL i faktycznie używasz SERIAL
, a następnie za pomocą GenerationType.SEQUENCE
może nawet kolidować z zachowaniem bazy danych. Prawidłowym sposobem mapowania Hibernate z preferowaną strategią identyfikacji Postgres jest użycie GenerationType.IDENTITY
. Nawiasem mówiąc, kod jest również znacznie krótszy i bardziej czytelny:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;