让我们做一些调查(查看 Hibernate 资源):
定义了 AUTO的AnnotationBinder
映射方式:
switch ( generatorEnum ) {
// ...
case AUTO:
return useNewGeneratorMappings ?
org.hibernate.id.enhanced.SequenceStyleGenerator.class.getName() : "native";
// ...
如果您不使用 NewGeneratorMappings,您将被本机实现所困。Hibernate 将根据数据库解决此问题(请参阅此答案以查看您的特定数据库的内容)。
但是由于您使用了 NewGeneratorMappings,我们必须查看SequenceStyleGenerator
:
protected String determineOptimizationStrategy(Properties params, int incrementSize) {
// ... some stuff to calculate defaultOptimizerStrategy
// OPT_PARAM = "optimizer"
return ConfigurationHelper.getString( OPT_PARAM, params, defaultOptimizerStrategy);
}
假设传递了正确的属性并且您在其中有一个“优化器”属性,那么您的值应该被返回。该值用于调用OptimizerFactory.buildOptimizer
(作为第一个参数):
public static Optimizer buildOptimizer(String type, Class returnClass, int incrementSize) {
final Class<? extends Optimizer> optimizerClass;
final StandardOptimizerDescriptor standardDescriptor =
StandardOptimizerDescriptor.fromExternalName( type ); // HILO("hilo", HiLoOptimizer.class),
if ( standardDescriptor != null ) {
optimizerClass = standardDescriptor.getOptimizerClass();
}
else {
try {
optimizerClass = ReflectHelper.classForName( type );
}
catch( Throwable ignore ) {
LOG.unableToLocateCustomOptimizerClass( type );
return buildFallbackOptimizer( returnClass, incrementSize );
}
}
try {
final Constructor ctor = optimizerClass.getConstructor( CTOR_SIG );
return (Optimizer) ctor.newInstance( returnClass, incrementSize );
}
catch( Throwable ignore ) {
LOG.unableToInstantiateOptimizer( type );
}
return buildFallbackOptimizer( returnClass, incrementSize );
}
private static Optimizer buildFallbackOptimizer(Class returnClass, int incrementSize) {
return new NoopOptimizer( returnClass, incrementSize );
}
所以它要么找到你的值“hilo”(或你的“HiLoOptimizer”),实例化它并返回它,要么它会记录一些错误消息。如果您在日志中没有发现错误消息,我会检查 cfg.xml 中的属性是否真正被使用。尝试getProperties()
在您的org.hibernate.internal.SessionFactoryImpl
实例上访问它们。