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

Я работаю над продуктом, который будет поддерживать несколько механизмов баз данных (Oracle, MSSQL, MySQL). Для Oracle я бы предпочел использовать последовательности, а не таблицу последовательностей, чтобы избежать потенциальных проблем параллелизма и блокировки при установке большого объема, но другие механизмы базы данных не поддерживают последовательности. Кроме того, я бы предпочел использовать одну последовательность на таблицу, а не глобальную последовательность (такую ​​как 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

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