Mapping PostgreSQL serial type with Hibernate annotations

后端 未结 4 1751
北海茫月
北海茫月 2020-12-02 23:13

I am using Hibernate 3.3 and PostgreSQL 8.x and would like to use Hibernate annotations to map an auto-incremented column which is NOT a primary key.

It doesn\'t ma

相关标签:
4条回答
  • 2020-12-02 23:42

    I'm using this with postgresql9.1, should work with 8 too:

    @SequenceGenerator(allocationSize=1, initialValue=1, sequenceName="account_id_seq", name="account_id_seq")
    @GeneratedValue(generator="account_id_seq", strategy=GenerationType.SEQUENCE)
    @Id
    @Column(name="id")
    private Integer id;
    
    0 讨论(0)
  • 2020-12-02 23:45

    The following mapping should work fine:

    @Column(name = "orderId")
    @Generated(GenerationTime.INSERT)
    private Integer orderId;
    

    Note, however, that generated value for freshly saved objects is not available until session is flushed.

    EDIT: Note that this mapping doesn't affect doesn't make Hibernate to create a column of type serial during schema generation, since Hibernate doesn't know anything about the nature of value generation at the database side. Therefore, if you want Hibernate to create a column with a proper type, you need to specifiy it explicitly:

    @Column(name = "orderId", columnDefinition = "serial")
    @Generated(GenerationTime.INSERT)
    private Integer orderId;
    

    And on a recent Hibernate version (4.3), you can use this:

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long orderId;
    
    0 讨论(0)
  • 2020-12-02 23:59

    Database sequence is not sync with your private key. So you need to update sequence index.

    Check your sequence id from db and execute this sql command. (Do not forget to get backup your db just in case)

    SELECT setval('your_primary_key_sequence', (SELECT MAX(your_primary_key) FROM your_table)+1);
    
    0 讨论(0)
  • 2020-12-03 00:05

    the accepted answer doesn't work for me.

    this did though:

    @Id
    @Column(name = "your_id", columnDefinition = "serial")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer yourId;
    
    0 讨论(0)
提交回复
热议问题