使用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(); }
额外检查项
- 序列名一致性:你创建的序列名为
ref_seq,但SQL中调用的是IPE2REF_SEQ_BATCH,请确认两者是否一致,避免出现序列不存在的错误。 - 事务上下文:
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
相关产品推荐
相关产品推荐

