Есть ли способ динамически выбирать стратегию @GeneratedValue, используя аннотации JPA и Hibernate?

Я работаю над продуктом, который будет поддерживать несколько движков баз данных (Oracle, MSSQL, MySQL). Для Oracle я предпочел бы использовать последовательности, а не таблицу Sequence, чтобы избежать потенциальных проблем concurrency и блокировки при установке большого объема, но другие двигатели базы данных не поддерживают последовательности. Кроме того, я предпочел бы использовать одну последовательность для таблицы, а не глобальную последовательность (например, hibernate_sequence), поэтому @GeneratedValue(strategy = GenerationType.AUTO) не будет работать. Есть ли способ динамически выбирать стратегию во время выполнения?

Ответ 1

На самом деле, Hibernate интерпретирует как GenerationType.AUTO, так и GenerationType.SEQUENCE, используя org.hibernate.id.enhanced.SequenceStyleGenerator. SequenceStyleGenerator - это стратегия формирования идентификатора, которая выбирает одну из двух стратегий, основанных на том, что поддерживает базовая база данных. Если база данных поддерживает последовательности, SequenceStyleGenerator использует последовательности; если это не так, SequenceStyleGenerator возвращается к использованию "таблицы последовательности". Это "отображение", из которого используется генератор, управляется настройкой: hibernate.id.new_generator_mappings. Установка этого параметра в true позволяет только что описанное выше поведение. К сожалению, для соображений обратной совместимости мы должны были по умолчанию использовать false. Поэтому, чтобы воспользоваться этим, вам нужно убедиться, что для параметра установлено значение true.

Кроме того, вы можете настроить SequenceStyleGenerator, чтобы выбрать глобальную последовательность или последовательность для каждого объекта, если имя не указано. Это контролируется настройкой с именем prefer_sequence_per_entity

SequenceStyleGenerator вполне конфигурируется в целом. Посмотрите на его javadocs для получения дополнительной информации: http://docs.jboss.org/hibernate/orm/4.1/javadocs/index.html?org/hibernate/id/enhanced/SequenceStyleGenerator.html