小编典典

休眠与Oracle序列不使用它

hibernate

我已将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,则有时间不停地调用“从double中选择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;

阅读 329

收藏
2020-06-20

共1个答案

小编典典

这是因为SequenceGenerator实际上不是序列生成器。这是一个序列高音发生器。这意味着,第一次调用它时,它将从序列中获取下一个值(例如6),然后将该值乘以50并得到结果(300)。下次调用它时,它返回301(不进行序列操作),依此类推,直到达到349。然后它向序列请求下一个值,并获得7,将其再次乘以50,得到350。算法描述可能相距一个,但您明白了。

如果停止并启动您的应用程序,则将存在空白。但是它比纯序列生成器更有效,因为它每50代只进行一次数据库调用。

参见http://docs.jboss.org/hibernate/core/3.6/reference/zh-
CN/html_single/#mapping-declaration-id-enhanced-
optimizers和http://docs.jboss.org/hibernate/core/有关详细信息,请参见3.6 / reference /
zh-CN / html_single /#mapping-declaration-id-
generator

2020-06-20