You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Hibernate调用MariaDB序列时nextval每次递增2的问题

问题解决:MariaDB序列通过Hibernate调用每次递增2而非1

核心问题定位

你的代码中两次调用了crit.list(),每次调用都会执行一次SELECT NEXTVAL(...)语句,导致序列被连续递增两次,最终表现为每次获取的步长为2。

修复方案

修改SeqForIpe2RefNumDaoImpl中的代码,将查询结果一次性存入变量,避免重复执行SQL:

@Override
public Integer getSeqForIpe2Ref() {
    logger.info("In getSeqForIpe2Ref() :");
    Session session = sessionFactory.getCurrentSession();
    SQLQuery crit = session.createSQLQuery("SELECT NEXTVAL(IPE2REF_SEQ_BATCH)");
    BigInteger seqNbr = BigInteger.valueOf(0);
    // 将查询结果一次性存入变量,避免重复触发SQL执行
    List<?> resultList = crit.list();
    if (resultList.size() > 0) {
        seqNbr = (BigInteger) resultList.get(0);
    }
    logger.info("SEQUENCE NUM :"+seqNbr.intValue());
    return seqNbr.intValue();
}

额外检查项

  1. 序列名一致性:你创建的序列名为ref_seq,但SQL中调用的是IPE2REF_SEQ_BATCH,请确认两者是否一致,避免出现序列不存在的错误。
  2. 事务上下文:sessionFactory.getCurrentSession()需要在事务环境中运行,建议在getSeqForIpe2Ref方法上添加@Transactional注解,避免Session相关异常:
    @Override
    @Transactional
    public Integer getSeqForIpe2Ref() {
        // 原有代码逻辑
    }
    

原理说明

SQLQuery.list()方法每次调用都会向数据库发送SQL请求并执行,原代码中第一次调用crit.list().size()触发一次NEXTVAL递增,第二次调用crit.list().get(0)又触发一次NEXTVAL递增,因此序列每次被连续递增两次,最终返回的是第二次递增后的值,看起来就像是步长为2。

内容的提问来源于stack exchange,提问作者Ashok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:25:24