hilo是hibernate中最長用的一種生成方式,hibernate給出了hilo 和 seqhilo兩種生成器,他們的分別向下面一樣配置
<id name="id" type="int" column="id"> <generator class="hilo"> <param name="table">wasw100_hilo_tbl</param> <param name="column">next_value</param> <param name="max_lo">100</param> </generator> </id>
<id name="id" type="int" column="id"> <generator class="seqhilo"> <param name="sequence">hi_value</param> <param name="max_lo">100</param> </generator> </id>
seqhilo生成器需要數據庫對sequence的支持,這裏只討論更通用的hilo生成器。
如果你按照下面的方式配置
<generator class="hilo"> <param name="max_lo">100</param> </generator>
這樣的缺省配置對應的數據庫表是:hibernate_unique_key,對應的數據庫字段是:next_hi。next_hi必須有一條記錄否則會出現錯誤。
討論前先說明幾個簡寫的意義,以最上面那個配置爲例:
hi: 高值--從數據庫wasw100_hilo_tbl讀取的next_value值
lo: 低值--hibe自動維護,從0到max_lo(看下面)
max_lo: 配置文件中<param name="max_lo">100</param>的值,這裏是100
hibernate根據hilo生成器生成主鍵的過程:
1.讀取並記錄數據庫的wasw100_hilo_tbl表中next_value字段的值,數據庫中此字段值加1保存
2.hibernate取得lo值(0到max_lo-1循環,lo到max_lo時,執行步驟1,然後lo繼續從0到max_lo循環)
取得hi值和lo值後,根據下面的公式計算主鍵值:
hi*(max_lo+1)+lo;
例如:
hi初始爲2,max_lo爲3
生成的值依次是:
讀取hi爲2,寫到數據庫爲3
2*(3+1)+0=8
2*(3+1)+1=9
2*(3+1)+2=10
2*(3+1)+3=11
這有次讀寫表wasw100_hilo_tbl操作,hi變爲3,數據庫成爲4
3*(3+1)+0=12
3*(3+1)+1=13
關閉數據庫,下次打開時,讀取hi值爲4,數據庫變爲5
4*(3+1)+0=16
但是有一種特殊情況,就是hi是0的時候,那麼第一個值不是0*(max_lo+1)+0=0
而是lo跳過0從1開始,直接是1、2、3……
那max_lo配置多大合適呢?
這要根據具體情況而定,如果系統一般不重啓,而且需要用此表建立大量的主鍵,可以吧max_lo配置大一點,這樣可以減少讀取數據表wasw100_hilo_tbl的次數,提高效率;反之,如果服務器經常重啓,可以吧max_lo配置小一點,可以避免每次重啓主鍵之間的間隔太大,造成主鍵值主鍵不連貫。