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主键生成策略参考文章: