I have a class with the following definition:
@Id
@SequenceGenerator(name = "SEQ_ACE_WORKERS_QUEUE_STATS_ID", sequenceName = "SEQ_ACE_WORKERS_QUEUE_STATS_ID", allocationSize = 500)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ACE_WORKERS_QUEUE_STATS_ID")
@Column(name = "ID")
private long Id;
When we ran it on Jboss 4.2.3 it worked fine and generated the proper ID's (starting from 1000+)
Now we moved to jboss 7.1.1 and it generates negative ID's! (starting from -498 and going up)
Any idea why this might happen?
The new behaviour is the followings:
AllocationSize is a range of primary key values reserved for Hibernate.
And the select seq.nextval
from dual will be done only after hibernate consumed this range of primary keys.
So you must declare the same value on both allocationSize
(Hibernate) and sequence increment by
(DB)
When explicitly set allocationSize=500
, e.g. on Oracle
create sequence SEQ_ACE_WORKERS_QUEUE_STATS_ID
MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
INCREMENT BY 500
NOCACHE
NOCYCLE;
Otherwise, you'll notice negative values or constraint errors raised from your DB because of primary key collisions.
When the app server is restarted, you'll notice the 'jump' between the latest primary key allocated, and the 'newly' sequence number selected at restart.
Final comment: default value is 50. So if you don't specify allocationSize
on the Hibernate side, you must declare increment by
50 on the DB side.