Конфигурация Hibernate cfg.xml для генератора последовательностей

Товарищи разработчики, мне сложно настроить генерацию последовательности.

Я унаследовал постоянный класс со следующим определением поля id:

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long 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. Попробуйте получить к ним доступ с getProperties() на ваше org.hibernate.internal.SessionFactoryImpl пример.

Пока нет способа сделать это. но также я не мог найти способ сделать это с новым

hibernate.id.new_generator_mappings = true

Этот будет использовать новый SequenceStyleGenerator, но я не мог настроить это. Параметры, используемые для конфигурации, такие как "optimizer" и "increment_size", не передаются в метод, который настраивает генератор.

Суть в том, что я не знаю, как предполагается использовать этот файл "hibernate.id.new_generator_mappings" для использования оптимизатора hilo и его правильной настройки, а мои возможности обратного инжиниринга оказались ненадежными.

Чтобы использовать hilo, я должен был сделать это @GeneratedValue(стратегии = SEQUENCE), который работает для тестирования, но это не очень хороший вариант для меня.

спасибо @xwoker, но я не смог этого сделать.

Другие вопросы по тегам