【问题标题】:Hibernate cfg.xml configuration for sequence generator序列生成器的 Hibernate cfg.xml 配置
【发布时间】:2013-10-30 21:29:17
【问题描述】:

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

我继承了一个具有以下 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 总是被选中。

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

【问题讨论】:

  • 您是否有一些额外的 applicationContext.xml 文件可能会覆盖您在 cfg.xml 中的设置?另见stackoverflow.com/a/12636086/2615437?
  • 您是否为休眠启用了调试级别日志记录,它是否说明了您正在使用哪些属性?
  • 我没有这样的文件。我认为我使用的属性可能不是正确的。我会检查一下到底使用了哪些属性。

标签: hibernate hibernate-mapping sequence-generators


【解决方案1】:

让我们做一些调查(查看 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);
}

假设传递了正确的属性并且您在其中有一个“优化器”属性,那么您的值应该被返回。该值用于调用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。尝试在您的 org.hibernate.internal.SessionFactoryImpl 实例上使用 getProperties() 访问它们。

【讨论】:

  • 当我尝试调试这段代码时,它表明在没有生成器的情况下使用 Auto 方法实际上不会完全按照我的预期执行这段代码。构建优化器的属性只是有限的,因为“没有生成器”(它在 @ID 的注释中)。我不记得确切的代码部分,但我会再次检查getProperties。
  • 您是否知道,在哪里可以找到 hibernate.cfg.xml 的所有配置属性的完整列表?顺便谢谢。
  • 不,不是一个完整的列表。 Hibernate 文档不是那个完整的......这就是为什么我会尝试查看相关代码正在寻找哪些属性并查看实际使用的属性是否真的来自 cfg.xml
  • 我做了很多调试,遗憾的是以下内容不起作用: // OPT_PARAM = "optimizer" return ConfigurationHelper.getString( OPT_PARAM, params, defaultOptimizerStrategy);因为参数在属性中没有 OPT_PARAM,即使它在 SessionFactoryImpl.getProperties() 中。方法中传递的参数是动态构建的,它不具有会话工厂中的所有属性。另一件事是,SessionFactoryImpl.getProparties() 返回所有没有被 hibernate 定义的属性。所以打印无济于事
【解决方案2】:

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

hibernate.id.new_generator_mappings = true

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    相关资源
    最近更新 更多