Hibernate, отображающий составной ключ с нулевыми значениями

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

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

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

Ответы

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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