Myslím, že přijatá odpověď od Petara není správná nebo již není správná. Automatické zvýšení v Postgresu je řešeno pomocí SERIAL
pseudo typ, to je pravda. Mapování, které poskytuje Petar, však povede k následujícímu DDL generovanému Hibernate 5.1:
CREATE SEQUENCE users_id_seq START 1 INCREMENT 50;
CREATE TABLE … (
id INT8 NOT NULL,
…
);
Toto nepoužívá SERIAL
, ale řízená sekvence Hibernate. Není ve vlastnictví tabulky a nebyla nastavena žádná výchozí hodnota. Generování DDL je samozřejmě funkce, kterou mnoho lidí v produkci nepoužívá (ale mnozí berou vygenerovaný kód jako šablonu).
Pokud svůj DDL napíšete ručně a skutečně použijete SERIAL
a poté pomocí GenerationType.SEQUENCE
může dokonce být v konfliktu s chováním databáze. Správný způsob mapování Hibernate pomocí preferované strategie ID Postgres je použití GenerationType.IDENTITY
. Mimochodem, kód je také mnohem kratší a čitelnější:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;