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

序列生成器的Hibernate cfg.xml配置,hibernate,hibernate-mapping,sequence-generators,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"

各位发展商:, 我发现很难配置序列生成

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

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
我所有的类都继承自这个类

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

这件事看起来很有希望:

<property name="hibernate.id.new_generator_mappings">true</property>
true
但是,我无法选择优化或增量大小(我想选择HiLo)

50
希洛
没用,也没用

<property name="increment_size">50</property>
<property name="optimizer">hilo</property>
50
希洛
也不是

org.hibernate.id.enhanced.HiLoOptimizer
总是选择NoopTimizer


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

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

定义自动映射的方式:

switch ( generatorEnum ) {
  // ...
  case AUTO:
    return useNewGeneratorMappings ? 
      org.hibernate.id.enhanced.SequenceStyleGenerator.class.getName() : "native";
  // ...
如果不使用NewGeneratorMappings,您就只能使用本机实现。Hibernate将根据数据库解决这个问题(请参阅,以了解特定数据库的解决方案)

但由于您使用了NewGeneratorMappings,我们必须查看:

假设传递了正确的属性,并且其中有一个“optimizer”属性,那么应该返回您的值。此值用于调用(作为第一个参数):

公共静态优化器buildOptimizer(字符串类型、类returnClass、int incrementSize){

最后一节课到目前为止还没有办法做到这一点。 但我也找不到一个方法来做这个新的

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

我的观点是,我不知道如何使用“hibernate.id.new_生成器_映射”来使用hilo优化器并正确配置,我的反向工程能力被证明是不可靠的

为了使用hilo,我必须做这个@GeneratedValue(strategy=SEQUENCE),它可以用于测试,但对我来说不是一个好的选择


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

您是否有一些额外的applicationContext.xml文件,可能会覆盖cfg.xml中的设置?另请参阅?您是否为hibernate启用了调试级别日志记录,它是否说明了您正在使用的属性?我没有这样的文件。我想我正在使用的属性可能没有选择正确的。我将检查使用的属性是否正确。当我尝试调试此代码时,它表明在没有生成器的情况下使用Auto方法实际上不会完全按照我的预期完成此代码。用于构建优化器的属性仅受到限制,因为“没有生成器”(在@ID的注释中)。我记不清代码部分了,但我会让它再检查一次getProperties。您是否知道,在哪里可以找到hibernate.cfg.xml的所有配置属性的综合列表?顺便说一句,谢谢。不,不是一个综合列表。hibernate文档没有那么完整…这就是我为什么要这么做的原因查看相关代码正在查看哪些属性,并查看实际使用的属性是否真的是来自cfg的属性。xmlI进行了大量调试,遗憾的是,以下内容无法正常工作://OPT_PARAM=“optimizer”return ConfigurationHelper.getString(OPT_PARAM,params,defaultOptimizerStrategy);因为参数在属性中没有OPT_PARAM,即使它位于SessionFactoryImpl.getProperties()中。在方法中传递的参数是动态生成的,并且它没有会话工厂中的所有属性。另一件事是SessionFactoryImpl.getProparties()返回所有未由hibernate定义的属性。因此打印没有帮助
switch ( generatorEnum ) {
  // ...
  case AUTO:
    return useNewGeneratorMappings ? 
      org.hibernate.id.enhanced.SequenceStyleGenerator.class.getName() : "native";
  // ...
protected String determineOptimizationStrategy(Properties params, int incrementSize) {

  // ... some stuff to calculate defaultOptimizerStrategy

  // OPT_PARAM = "optimizer"
  return ConfigurationHelper.getString( OPT_PARAM, params, defaultOptimizerStrategy);
}
 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 );
}
hibernate.id.new_generator_mappings = true