seqhilo算法如何在Hibernate中使用Postgresql处理序列

时间:2013-04-11 03:44:10

标签: hibernate

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生成的值是多少?这是如何工作的?

1 个答案:

答案 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,它会在数据库中命中一次