Vla*_*ada 20 hibernate sequence id-generation
我已经配置了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,有时间调用"从双重选择hibernate_sequence.nextval",但是由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;
Run Code Online (Sandbox Code Playgroud)
JB *_*zet 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有关详细信息.
我认为你的问题是数据库中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中的间隙是常见的.
| 归档时间: |
|
| 查看次数: |
39082 次 |
| 最近记录: |