Поставщики JPA: почему отношения / FK с не-PK столбцами работают в Hibernate и EclipseLink? - PullRequest
2 голосов
/ 02 мая 2011

Я только что узнал, что официально отношения / внешние ключи к столбцам не первичного ключа не поддерживаются JPA.См. Здесь:

Разрешает ли спецификация JPA ссылки на столбцы с не первичным ключом?

Почему такие отношения отображаются в Hibernate и EclipseLink (только в синтаксисе JPA 1.0как в примере, опубликованном там) ??

Похоже, что эти JPA-провайдеры просто наивно отображают столбцы, что, на мой взгляд, хорошо, но я бы хотел знать об этом явно.Это совпадение?Это предназначено?

Ответы [ 2 ]

1 голос
/ 03 мая 2011

Поддержка FK, которая ссылается на столбцы не-PK, является необязательной функцией (и так было всегда, поэтому нет «синтаксиса JPA 1.0», мой предыдущий ответ был неверным):

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

Однако Hibernate поддерживает его :

У него есть еще один параметр с именем referencedColumnName.Этот параметр объявляет столбец в целевом объекте, который будет использоваться для объединения.Обратите внимание, что при использовании referencedColumnName для столбца без первичного ключа связанный класс должен быть Serializable.Также обратите внимание, что referencedColumnName для столбца без первичного ключа должно быть сопоставлено со свойством, имеющим один столбец (другие случаи могут не работать).

Хотя, как уже было выяснено, такиеотношения не могут быть использованы как часть тождества.

1 голос
/ 02 мая 2011

EclipseLink / TopLink всегда позволял внешним ключам преднамеренно указывать на любое поле таблицы, поскольку первичные ключи объекта не обязательно должны быть pks, используемыми в таблице, - подойдет любой уникальный идентификатор.

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

...