2008-09-16 3 views
15

С Hibernate вы можете создать составной идентификатор, где один из столбцов, которые вы сопоставляете с идентификатором, может иметь нулевые значения?Hibernate сопоставление составного ключа с нулевыми значениями

Это относится к старой таблице, которая имеет уникальный ключ, который может иметь нулевые значения, но не первичный ключ.

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

+0

Я хотел бы знать, возможно ли это, моя база данных (OpenEdge) не поддерживает представления, и я не могу добавьте новые поля в таблицу, как вы это преодолели? – 2010-09-08 08:42:52

ответ

9

№. Первичные ключи не могут быть пустыми.

+0

Наш клиент предоставляет представление без первичного ключа. Для спящего режима я должен определить ПК. Но единственная уникальная комбинация полей включает поле с нулевым значением. – StefanTo 2016-11-18 08:29:00

0

Зачем вам это нужно? Ваш составной идентификатор должен отображать первичный ключ вашей таблицы, и не кажется разумным положить нулевые значения в ключ, не так ли?

EDIT: Hibernate не позволяет это сделать; вы можете поместить свойство вне ключа и немного настроить DAO, чтобы принять поле в поле, где необходимо.

+2

Отображение устаревших таблиц - одна из причин, почему это может потребоваться. У меня есть случай, когда это также требуется, и БД не поддерживает представления (Progress OpenEdge). – 2010-09-08 08:44:57

0

Это не рекомендуется. Не могли бы вы вместо этого использовать представление и карту? Вы можете использовать COALESCE для предоставления значения по умолчанию, если вы застряли в устаревших данных. У нас было много проблем с составными ключами, и я думаю, что нулевые значения вызовут еще больше проблем.

0

Для составных клавиш (предполагается, что база данных допускает нули в PK), вы можете иметь максимум number_of_cols^2 - 1 записей, содержащих значения NULL (например, для составного ключа из 2 столбцов вы можете иметь 3 строки с нулевым номером первичного ключа, четвертый - это ПК без нулей).

0

Вы не получите ошибку, но Hibernate не сможет сопоставить эти строки с NULL значением для составного столбца для вашего объекта. Это означает, что вы получаете сущность с значениями NULL в результате.

0

К несчастью, нет. Мне либо пришлось использовать обходное решение:

Я использовал композитный идентификатор для представления (! Not table), где строки могут быть идентифицированы по 2 столбца точно (A, B). Хотя один из столбцов (B) может иметь нулевые значения, а также положительные целые числа. Итак, мое обходное решение заключается в том, что я создал новый col в представлении: «BKey», и мое представление написано так, как если бы B было пустым, тогда значение BKey равно -1 else BKey = B. (Только положительные целые числа occour в B и null) , Я также изменил реализацию композитного id, чтобы использовать BKey вместо B. Надеюсь, что это поможет кому-то.

Смежные вопросы