Hibernate не заполняет столбец AUTO_INCREMENT, являясь частью составного PK, ошибки или анти-функции?

Я обнаружил проблему с Hibernate и составным ключом с автоматическим увеличением одного из его столбцов.

Я использую MySQL и первичный ключ, состоящий из двух столбцов: GID и LANG. Столбец GID установлен как AUTO_INCREMENT. Вставка работает, спящий режим вставляет новую строку, MySQL добавляет автоматически сгенерированный идентификатор, когда GID равен нулю. Однако Hibernate не устанавливает поле GID в заданном объекте для сохранения.

Я слышал о проблемах, обычно связанных с использованием составного первичного ключа с спящим режимом, поэтому я спрашиваю, является ли это ошибкой в ​​спящем режиме или анти-функцией, оставленной разработчиками с умыслом (не будет реализовано, потому что нет)?


person Danubian Sailor    schedule 15.02.2011    source источник


Ответы (2)


Справочное руководство по аннотациям Hibernate для 3.5.6-Final (Раздел 2.2.3.2.4. Генерация частичного идентификатора) сказано, что можно использовать последовательности для части составного идентификатора.

2.2.3.2.4. Генерация частичного идентификатора

Hibernate поддерживает автоматическое создание некоторых свойств идентификатора. Просто используйте аннотацию @GeneratedValue для одного или нескольких свойств идентификатора.

Предупреждение: команда Hibernate всегда считала такую ​​конструкцию в корне неправильной. Постарайтесь исправить свою модель данных, прежде чем использовать эту функцию.

(Есть пример в Документе!)

Но partenon тоже подходит: Hibernate Reference Guid (раздел 8.4. Компоненты как составные идентификаторы) для той же версии сказано, что это невозможно (для xml).

Вы не можете использовать IdentifierGenerator для создания составных ключей. Вместо этого приложение должно назначать свои собственные идентификаторы.

Я не знаю, есть ли разница между сопоставлением аннотаций и XML.

<irony>Мне все больше и больше нравится спящий режим.</irony>

person Ralph    schedule 15.02.2011

Это не ошибка. Это желаемое поведение, как вы можете видеть в документации:

Вы не можете использовать IdentifierGenerator для создания составных ключей. Вместо этого приложение должно назначать свои собственные идентификаторы.

http://docs.jboss.org/hibernate/stable/core/reference/en/html/components.html#components-compositeid

person jpkrohling    schedule 15.02.2011
comment
Я бы назвал это выбором дизайна разработчиками Hibernate, а не желаемым поведением, потому что это явно нежелательно для многих пользователей. - person Zds; 04.08.2011