Acho que a resposta aceita do Petar não está correta ou não está mais correta. O auto-incremento no Postgres é tratado através de
SERIAL
pseudo tipo, isso é correto. No entanto, o mapeamento que o Petar fornece resultará no seguinte DDL gerado pelo Hibernate 5.1:CREATE SEQUENCE users_id_seq START 1 INCREMENT 50;
CREATE TABLE … (
id INT8 NOT NULL,
…
);
Isso não está usando
SERIAL
, mas uma sequência gerenciada pelo Hibernate. Ele não pertence à tabela e nenhum valor padrão foi definido. Claro que a geração de DDL é um recurso que muitas pessoas não usam em produção (mas muitos tomam o código gerado como modelo). Se você escrever manualmente seu DDL e realmente usou
SERIAL
, em seguida, usando GenerationType.SEQUENCE
pode até entrar em conflito com o comportamento do banco de dados. A maneira correta de mapear o Hibernate com a estratégia de ID preferida do Postgres é usando GenerationType.IDENTITY
. Aliás, o código também é muito mais curto e mais legível:@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;