问题描述:
使用自定义表来构建主键,在每次重启之后的新id总是比定义表里面的gen_val大allocationSize倍。

Model的定义

问题原因:
org.hibernate.id.MultipleHiLoPerTableGenerator的configure()方法后面:

当maxLo大于1的时候,就调用new OptimizerFactory.LegacyHiLoAlgorithmOptimizer( returnClass, maxLo ),
这个方法会调用到org.hibernate.id.enhanced.OptimizerFactory

在这个代码运行之后就到:

方法multiplyBy调用到org.hibernate.id.IdentifierGeneratorHelper

=======================
在org.hibernate.id.MultipleHiLoPerTableGenerator
maxLo = ConfigurationHelper.getInt(MAX_LO, params, Short.MAX_VALUE);可以看到,param里面的MAX_LO值,才出现这个问题。

问题追溯:
那么继续找什么时候初始化这个param?
org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory

上面是被org.hibernate.mapping.SimpleValue

方法调用

在这个方法里面,identifierGeneratorProperties保存有max_lo信息,什么时候设定?
这个类里面有个

被org.hibernate.cfg.BinderHelper类的

调用

gen里面设定params,然后传给这个方法的params。

最后参考文档:Hibernate Annotations参考文档 http://www.okrs.cn/blog/news/?1027.html, 知道注解加上

来设定这个max_lo值,就解决了问题。