Sequence的start with 值如何確定才能保證生成的主鍵不會沖突???
我的項目中最開始數據庫表主鍵的生成策略是 increment,但由於后來采用了集群部署的方式,出現了主鍵沖突的問題. 故改為使用 Sequence生成.
<id name="id" column="id"> <generator class="increment" /> </id>
<generator class="sequence"> <param name="sequence">SEQ_RECEIPT_HIBERNATE</param> </generator>
統計數據庫中,指定序列被哪些表的主鍵使用,故將全部最大值加起來作為序列的開始值+1,可以保證絕對不會沖突.
有些表中無數據,因此上要作判空處理.
1. 一個序列只被一個表使用時
-- MANTIS_CARD_LOG : OID -- #### SEQ_RECEIPT_CARD_LOG ######--- -- select (case when max(l1.OID) is null then 0 else max(l1.OID) end) SEQ_RECEIPT_CARD_LOG_MAX from MANTIS_CARD_LOG l1 --
create sequence SEQ_RECEIPT_CARD_LOG minvalue 1 maxvalue 9999999999999999999999 start with 1000000021 increment by 1 nocache;
2. 一個序列被多個表使用時
--MANTIS_CARD_INFO:OID --MANTIS_CARD_REP_INFO:OID -- #### SEQ_RECEIPT_CARD ######--- -- select (c1c1.c1Max + c2c2.c2Max ) SEQ_RECEIPT_CARD_MAX from (select (case when max(c1.OID) is null then 0 else max(c1.OID) end) c1Max from MANTIS_CARD_INFO c1) c1c1, (select (case when max(c2.OID) is null then 0 else max(c2.OID) end) c2Max from MANTIS_CARD_REP_INFO c2) c2c2 --
create sequence SEQ_RECEIPT_CARD minvalue 1 maxvalue 99999999999999999999 start with 1000001 increment by 1 nocache;
Hibernate主鍵生成策略參考文章: