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".
Потенциальные решения:
- установлен на SequenceGenerator allocSize=1 (без установки hibernate.id.new_generator_mappings=false)
- создайте последовательность 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