2013-04-11 26 views
0

seqhilo算法在Hibernate和PostgreSQL中如何使用sequenceseqhilo算法如何在Hibernate中使用Postgresql的順序工作

<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

第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請求的方式一次觸及數據庫的方式