seqhilo
算法如何在Hibernate中使用Postgresql与sequence
一起使用?
<id name="id" column="attid" type="long"
unsaved-value="-1">
<generator class="seqhilo">
<param name="max_lo">1</param>
<param name="sequence">
att_seq
</param>
</generator>
</id>
如果我使用这个配置,让我们说att_seq
的当前值是1000,那么Hibernate生成的值是多少?这是如何工作的?
答案 0 :(得分:1)
步骤1:在应用启动时,hibernate将其内部管理的lo变量初始化为max_lo + 1。所以lo变得= 2
步骤2:要生成下一个值,它使用以下代码:
if (maxLo < 1) {
long val = ( (Number) super.generate(session, obj) ).longValue();
if (val == 0) val = ( (Number) super.generate(session, obj) ).longValue();
return IdentifierGeneratorFactory.createNumber( val, returnClass );
}
if ( lo>maxLo ) {
long hival = ( (Number) super.generate(session, obj) ).longValue();
lo = (hival == 0) ? 1 : 0;
hi = hival * ( maxLo+1 );
if ( log.isDebugEnabled() )
log.debug("new hi value: " + hival);
}
return IdentifierGeneratorFactory.createNumber( hi + lo++, returnClass );
总结:第一次击中序列并获得值。将其乘以(max_lo + 1)并为您提供唯一ID。 下次它没有命中数据库并在内部将最后一个值递增1。
之后它再次重复上述循环。
因此,对于每两个请求的唯一ID,它会在数据库中命中一次