Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mapping PostgreSQL serial type with Hibernate annotations

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 matter if the column is mapped using SERIAL type or sequences in Postgres as long as it gets auto-incremented by the database and not by Hibernate. I tried the following mappings, but they always generated null orderId.

@Column(name = "orderId", insertable = false) @Generated(GenerationTime.INSERT) //@GeneratedValue(strategy = javax.persistence.GenerationType.AUTO) private Integer orderId; 

I will appreciate any help with this.

Thanks

like image 573
alecswan Avatar asked Feb 12 '11 18:02

alecswan


1 Answers

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; 
like image 166
axtavt Avatar answered Oct 14 '22 19:10

axtavt