GeneratedValue in Postgres

后端 未结 2 1013
死守一世寂寞
死守一世寂寞 2020-12-10 16:22

I have my entity class mapped like below:

@Entity
@Audited
@Table(name=\"messages_locale\")
public class Locale {

    @Id
    @GeneratedValue
    @Getter @S         


        
2条回答
  •  不思量自难忘°
    2020-12-10 17:01

    I think the accepted answer from Petar is not correct, or not correct any longer. The auto-increment in Postgres is handled through SERIAL pseudo type, that’s correct. However, the mapping that Petar gives will result in the following DDL generated by Hibernate 5.1:

    CREATE SEQUENCE users_id_seq START 1 INCREMENT 50;
    
    CREATE TABLE … (
        id INT8 NOT NULL,
        …
    );
    

    This is not using SERIAL, but a Hibernate managed sequence. It is not owned by the table and no default value has been set. Of course, DDL generation is a feature that many people do not use in production (but many take the generated code as a template).

    If you hand-write your DDL and actually used SERIAL, then using GenerationType.SEQUENCE may even conflict with the database behaviour. The correct way to map Hibernate with Postgres’ preferred ID strategy is using GenerationType.IDENTITY. Incidentally, the code is also much shorter and more readable:

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id;
    

提交回复
热议问题