Hibernate Migration 4.x в 5.0.7.Final: платформа использует hibernate_sequence вместо mySequence (с Oracle и H2)

Я обновил версию hiberate с 4.0.1. Финал до 5.0.7. Финал (портирование с Jboss 7 на Wildfly 10).

Проблема: Hibernate framwork использует hibernate_sequence для генерации идентификатора вместо mySequence.

Конфигурация Hibernate: для обеспечения обратной совместимости hibernate.id.new_generator_mappings настроен как ложное значение.

Конфигурация объекта: Поле идентификатора аннотировано следующим JPA API:

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "myGenerator")
@SequenceGenerator(name = "myGenerator", sequenceName = "MY_GENERATOR_SEQ")
@Column(name="ID")
private Long id;

Конфигурация БД: последовательность MY_GENERATOR_SEQ определяется с опцией "INCREMENT BY 1".

Проблема возникает как для H2, так и для Oracle DB.

ВОПРОС: Я проанализировал реализацию и не знаю, может ли это быть ОШИБКА Hibernate или возможная неправильная конфигурация, которую я сделал для обратной совместимости???


Анализ: Hibernate во время запуска сервера получает некоторую инициализацию: метод SequenceStyleGenerator.configure определяет sequenceName QualifiedName как "hibernate_sequence", потому что он пытался получить значение из параметров Properties. В этот момент я заметил, что имя_последовательности MY_GENERATOR_SEQ присутствовало в параметрах свойств во время выполнения с ключом "sequence" (sequence=MY_GENERATOR_SEQ), но для стратегии извлечения (defineSequenceName) в качестве ключа необходимо указать "sequence_name". Таким образом, ключ, используемый для установки имени последовательности в параметрах свойств, является устаревшим классом org.hibernate.id.SequenceGenerator.SEQUENCE из-за hibernate.id.new_generator_mappings=false, но класс SequenceStyleGenerator требует org.hibernate.id.enhanced.SequenceStyleGenerator.SEQUENCE_PARAM ключ, чтобы получить "MY_GENERATOR_SEQ".

Потенциальные решения:

  1. установлен на SequenceGenerator allocSize=1 (без установки hibernate.id.new_generator_mappings=false)
  2. создайте последовательность MY_GENERATOR_SEQ на БД с INCREMENT BY 50 (без установки hibernate.id.new_generator_mappings=false)

Оба решения не применимы в моем контексте. Таким образом, единственное применимое "решение" таково: расширьте диалект, используемый для Oracle и H2, и переопределите метод getNativeIdentifierGeneratorClass следующим образом:

@Override
public Class getNativeIdentifierGeneratorClass() {
    if ( getIdentityColumnSupport().supportsIdentityColumns() ) {
      return IdentityGenerator.class;
    }
    else {
        //From hibernate-core 5.0.7.Final, org.hibernate.dialect.Dialect
        //the original return value was org.hibernate.id.enhanced.SequenceStyleGenerator.class
      return SequenceGenerator.class;
    }
  }

и, конечно же, установите "databasePlatform" на org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter с помощью диалекта ах-hoc.

Также представлены в спящем сообществе: https://hibernate.atlassian.net/browse/HHH-10656

0 ответов

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