Hibernate与Oracle序列不使用它 [英] Hibernate with Oracle sequence doesn't use it

查看:162
本文介绍了Hibernate与Oracle序列不使用它的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我配置了hibernate以使用oracle序列。 Sequence创建缓存= 20,增量= 1。



所有工作都很好,休眠持久化实体。 id值很奇怪:50,51 .... 76,201,202 ... 209,1008,1009,5129,5130 ....

如果我要求序列值(从双重选择hibernate_sequence.nextval)我得到的值如2,3,4 ....

如果我打开hibernate sql调试,有时间的时间调用从双选择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长ID;


解决方案

这是因为SequenceGenerator并不是一个真正的序列生成器。这是一个序列hi-lo发生器。这意味着第一次被调用时,它会从序列中获得下一个值(例如6),然后将该值乘以50并给出结果(300)。下一次它被调用时,它返回301(不去序列),依此类推,直到达到349.然后它询问序列中的下一个值并获得7,再乘以50再给你350. My算法描述可能会被忽略,但你明白了。



如果您停止并启动您的应用程序,它将会有差距。但它比纯序列生成器更有效率,因为它仅在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 了解详情。


I have configured hibernate to use oracle sequence. Sequence is created with cache=20, increment=1.

All works fine, hibernate persisting entities. The id value is strange: 50,51....76,201,202...209,1008,1009,5129,5130 ....

If I ask for sequence value (select hibernate_sequence.nextval from dual) I get value like 2,3,4 ....

If I turn on hibernate sql debug, there is time to time call "select hibernate_sequence.nextval from dual" but number assigned by hibernate to ID doesn't relay on sequence!

@Id
@Column(name = "ID", insertable = false, updatable = false)
@SequenceGenerator(name = "SequenceIdGenerator", sequenceName = "HIBERNATE_SEQUENCE")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SequenceIdGenerator")
private Long id;

解决方案

This is because the SequenceGenerator is not really a sequence generator. It's a sequence hi-lo generator. This means that the first time it's invoked, it gets the next value from the sequence (6 for example), then multiplies this value by 50 and gives you the result (300). The next time it's invoked, it returns 301 (without going to the sequence), and so on until it reaches 349. Then it asks the sequence for the next value and obtains 7, which it multiplies by 50 again to give you 350. My algorithm description could be off by one, but you get the idea.

If you stop and start your application, it will thus have gaps. But it's more efficient than a pure sequence generator because it only makes a database call once in 50 generations.

See http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-id-enhanced-optimizers and http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-id-generator for details.

这篇关于Hibernate与Oracle序列不使用它的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆