我已经将hibernate配置为使用oracle序列。使用cache = 20,increment = 1创建序列。
一切正常,hibernate持久化实体。 id值很奇怪:50,51 .... 76,201,202 ... 209,1008,1009,5129,5130 ....
如果我要求序列值(从双重中选择hibernate_sequence.nextval),我得到的值就像2,3,4 ....
如果我打开hibernate sql debug,有时间调用“select from hibernate_sequence.nextval from dual”,但是hibernate分配给ID的号码不会按顺序中继!
@Id
@Column(name = "ID", insertable = false, updatable = false)
@SequenceGenerator(name = "SequenceIdGenerator", sequenceName = "HIBERNATE_SEQUENCE")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SequenceIdGenerator")
private Long id;
答案 0 :(得分:33)
这是因为SequenceGenerator实际上不是序列生成器。这是一个序列hi-lo发生器。这意味着第一次调用它时,它从序列中获取下一个值(例如6),然后将该值乘以50并得到结果(300)。下次调用时,它返回301(不进入序列),依此类推,直到达到349.然后它会询问序列的下一个值并获得7,它再次乘以50得到350.我的算法描述可以一个接一个,但你明白了。
如果您停止并启动您的应用程序,它将有间隙。但它比纯序列生成器更有效,因为它只在50代中进行一次数据库调用。
有关详细信息,请参阅http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-id-enhanced-optimizers和http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-id-generator。
答案 1 :(得分:6)
我认为你的问题是数据库中ID列的值不是自然序列,而是你看到差距的原因:
一些背景知识:
select HIBERNATE_SEQUENCE.nextval from DUAL
时,序列的值都会增加。例如,请考虑以下情形:
你有两个实体Entity1和Entity2使用HIBERNATE_SEQUENCE作为ID生成器:
select HIBERNATE_SEQUENCE.nextval from DUAL
(返回104)所以最后你会:
解释了差距。
编辑:
即使@SequenceGenerator被设置为使用SequenceGenerator
而不是SequenceHiLoGenerator
(正如JB Nizet指出的那样,我认为这是间隙的更好解释),生成的ID存在差距通过序列是常见的事情。
答案 2 :(得分:0)
CREATE SEQUENCE SEQ_SEQUENCENAME INCREMENT BY 1 START WITH 1 MINVALUE 1;
grant all on SEQ_SEQUENCENAME to public;
@Id
@Column(name = "ID", unique = true, nullable = false)
@SequenceGenerator(name = "SequenceIdGenerator", sequenceName = "SEQ_SEQUENCENAME")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SequenceIdGenerator")
private int Id;