Hibernate: как работает стратегия генерации собственных идентификаторов

Hibernate имеет стратегию генерации идентификаторов под названием native, которая выбирает identity, sequence или hilo в зависимости от возможностей базовой базы данных. Я использовал MySQL с hibernate.hbm2ddl.auto=update, который сгенерировал id BIGINT(20) NOT NULL AUTO_INCREMENT для свойства id типа данных Long Java.

Я пытаюсь понять, как Hibernate выбрал AUTO_INCREMENT, когда использовал SchemaExport инструмент. AUTO_INCREMENT - это стратегия генерации первичного ключа по умолчанию для MySQL?

Может ли кто-нибудь помочь мне понять это?


person skip    schedule 14.04.2014    source источник


Ответы (1)


Hibernate при выборе механизма генерации ключей в собственном режиме будет пытаться выбрать лучший механизм, доступный в базе данных. В случае MySQL доступно автоматическое приращение, и Hibernate использует его вместо последовательности, потому что механизм автоматического приращения немного лучше, хотя последовательности также работают нормально.

Причина, по которой это лучше, заключается в том, что в одном подготовленном операторе JDBC, например, вставке, можно выполнить вставку И получить сгенерированный ключ без запроса базы данных - см. здесь для получения дополнительных сведений.

В случае последовательностей Hibernate должен сначала вызвать последовательность в какой-то момент, а затем использовать значение или результат его использования в формуле для заполнения ключа вставки, а затем выполнить вставку.

Автоинкремент сохраняет этот дополнительный обход базы данных, необходимый для увеличения последовательности, и это причина, по которой Hibernate предпочитает его в случае MySQL.

person Angular University    schedule 14.04.2014
comment
К тому же они могут сильно отличаться. Подумайте о наличии некоторого ограничения целостности для таблицы (уникальный ключ в другом поле). При вставке с использованием последовательности Hibernate получает новое значение из последовательности, устанавливает идентификатор объекта, а затем пытается сохранить его, затем возникает исключение, но идентификатор установлен. Но при использовании автонумерации спящий режим пытается вставить, возникает исключение (нарушение ограничения целостности), и объект не получает идентификатор. - person Amir Pashazadeh; 15.04.2014