Конфигурация 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, но я не смог этого сделать.