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

标签 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。

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

最佳答案

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

AnnotationBinder定义 AUTO 的映射方式:

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

如果您不使用 NewGeneratorMappings,您将只能使用 native 实现。 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() 访问它们。

关于序列生成器的 Hibernate cfg.xml 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19694154/

相关文章:

hibernate @SequenceGenerator 不是全局的

java - 在具有多个 @ManyToOne 关联的实体上使用 hibernate update() 时,如何限制关联表被考虑加入

java - 与 JPA 注释的双向 @OneToMany 关系似乎不起作用

java - Spring Data JPA - 具有复合键的实体,其中一列是与另一列相关的内部序列

java - 如何将不同的并发策略分配给同一个(持久性)实体?

java - 我应该如何获取相关实体?

java - 如何使用 Hibernate 在表中插入新行?

java - Hibernate Envers 不生成审计表

java - 非法尝试将非集合映射为 @OneToMany、@ManyToMany 或 @CollectionOfElements

用于字符序列生成器的 Java 库