提问者:小点点

序列生成器的Hibernate cfg. xml配置


各位开发人员,我发现很难配置序列生成。

我继承了一个具有以下id字段定义的持久类:

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;

我所有的类都继承自这个类。

我想要的主要是:我需要覆盖id生成的策略来使用HiLo。它必须在cfg. xml中,因为它是我唯一可以控制的地方。

这件事看起来很有希望:

<property name="hibernate.id.new_generator_mappings">true</property>

但是我不能选择优化或增量大小(我想去HiLo)

<property name="hibernate.id.increment_size">50</property>
<property name="hibernate.id.optimizer">hilo</property>

没有工作,也没有

<property name="increment_size">50</property>
<property name="optimizer">hilo</property>

<property name="optimizer">org.hibernate.id.enhanced.HiLoOptimizer</property>

始终选择NoopOptimizer。

任何提示都会有帮助。事先非常感谢。


共2个答案

匿名用户

让我们做一些调查(查看Hibernate源):

AnnotationBinder定义了AUTO的映射方式:

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中的属性是否真的被使用了。尝试在你的org.hibernate.interal.SessionFactoryImpl实例上使用getProperties()访问它们。

匿名用户

到目前为止,还没有办法做到这一点。但我也找不到用新的方法来做到这一点

hibernate.id.new_generator_mappings = true

这个将使用新的SequenceStyleGenerator,但我无法配置它。用于配置的参数,如“优化器”和“increment_size”,不会传递给配置生成器的方法。

我的观点是,我不知道这个“hibernate.id.new_generator_mappings”应该如何用于使用Hilo优化器并正确配置,我的逆向工程能力被证明是不可靠的。

要使用hilo,我必须这样做@GeneratedValue(策略=SEQUENCE),它适用于测试,但对我来说不是一个好的选择。

谢谢@xwoker,但我做不到。