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

时间:2013-10-30 21:29:17

标签: hibernate hibernate-mapping sequence-generators

研究员, 我发现很难配置序列生成。

我继承了一个具有以下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 个答案:

答案 0 :(得分:2)

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

AnnotationBinder定义了AUTO的映射方式:

switch ( generatorEnum ) {
  // ...
  case AUTO:
    return useNewGeneratorMappings ? 
      org.hibernate.id.enhanced.SequenceStyleGenerator.class.getName() : "native";
  // ...

如果您不使用NewGeneratorMappings,那么您将无法使用本机实现。 Hibernate将根据数据库解决这个问题(请参阅this answer以查看特定数据库的内容)。

但是既然您使用了NewGeneratorMappings,我们必须查看SequenceStyleGenerator

protected String determineOptimizationStrategy(Properties params, int incrementSize) {

  // ... some stuff to calculate defaultOptimizerStrategy

  // OPT_PARAM = "optimizer"
  return ConfigurationHelper.getString( OPT_PARAM, params, defaultOptimizerStrategy);
}

假设传递了正确的属性并且您有一个“optimizer”属性,那么应该返回您的值。该值用于调用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”),要实例化它并返回它,否则它会记录一些错误信息。如果您在日志中找不到任何错误消息,我会check whether the properties in the cfg.xml are actually really used。尝试使用getProperties()实例上的org.hibernate.internal.SessionFactoryImpl访问它们。

答案 1 :(得分:0)

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

做到这一点的方法
hibernate.id.new_generator_mappings = true

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

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

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

感谢@xwoker,但我无法完成它。